निकालने मूल्यों में से एक सरणी है कि राशि के लिए एक निश्चित मूल्य pyspark

0

सवाल

मैं एक dataframe है कि एक सरणी के साथ के रूप में डबल्स मूल्यों. सरणी के भीतर, 1 या संख्या की राशि के बराबर होती है एक निश्चित लक्ष्य मूल्य, और मैं चाहते हैं निकालने के लिए मूल्यों है कि या तो मूल्य के बराबर या अभिव्यक्त किया जा सकता है बराबर करने के लिए मूल्य. मैं करना चाहते हैं के लिए सक्षम होना करने के लिए इस में PySpark.

| Array                  | Target    | NewArray         |
| -----------------------|-----------|------------------|
| [0.0001,2.5,3.0,0.0031]| 0.0032    | [0.0001,0.0031]  |
| [2.5,1.0,0.5,3.0]      | 3.0       | [2.5, 0.5, 3.0]  |
| [1.0,1.0,1.5,1.0]      | 4.5       | [1.0,1.0,1.5,1.0]|
arrays extract pyspark sum
2021-11-23 19:39:03
1

सबसे अच्छा जवाब

1

आप encapsulate कर सकते हैं के तर्क के रूप में एक udf और बनाने के लिए NewArray इस पर आधारित है. मैं उधार लिया है के लिए तर्क की पहचान के तत्वों की सरणी संक्षेप करने के लिए एक लक्ष्य मूल्य से यहाँ.


from pyspark.sql.types import ArrayType, DoubleType
from pyspark.sql.functions import udf
from decimal import Decimal

data = [([0.0001,2.5,3.0,0.0031], 0.0032),
([2.5, 1.0, 0.5, 3.0], 3.0),
([1.0, 1.0, 1.5, 1.0], 4.5), 
([], 1.0),
(None, 1.0),
([1.0,2.0], None),]


df = spark.createDataFrame(data, ("Array", "Target", ))


@udf(returnType=ArrayType(DoubleType()))
def find_values_summing_to_target(array, target):
    def subset_sum(numbers, target, partial, result):
        s = sum(partial)
        # check if the partial sum is equals to target
        if s == target: 
            result.extend(partial)
        if s >= target:
            return  # if we reach the number why bother to continue
    
        for i in range(len(numbers)):
            n = numbers[i]
            remaining = numbers[i+1:]
            subset_sum(remaining, target, partial + [n], result)
    result = []
    if array is not None and target is not None:
        array = [Decimal(str(a)) for a in array]
        subset_sum(array, Decimal(str(target)), [], result)
        result = [float(r) for r in result]
    return result

df.withColumn("NewArray", find_values_summing_to_target("Array", "Target")).show(200, False)

आउटपुट

+--------------------------+------+--------------------+
|Array                     |Target|NewArray            |
+--------------------------+------+--------------------+
|[1.0E-4, 2.5, 3.0, 0.0031]|0.0032|[1.0E-4, 0.0031]    |
|[2.5, 1.0, 0.5, 3.0]      |3.0   |[2.5, 0.5, 3.0]     |
|[1.0, 1.0, 1.5, 1.0]      |4.5   |[1.0, 1.0, 1.5, 1.0]|
|[]                        |1.0   |[]                  |
|null                      |1.0   |[]                  |
|[1.0, 2.0]                |null  |[]                  |
+--------------------------+------+--------------------+
2021-11-29 17:22:52

आपकी मदद के लिए धन्यवाद, यह निश्चित रूप से मुझे पर डाल सही ट्रैक. हालांकि मैं कर रहा हूँ परेशानी हो रही है इस बिंदु पर: यदि s >= लक्ष्य: वापसी मैं एक त्रुटि मिलती है जब में छोड़ दिया: TypeError: '>=' समर्थित नहीं की परिस्थितियों के बीच 'पूर्णांक' और 'NoneType'. जब मैं इस से बाहर चलाता है, लेकिन यह वापस नहीं करता है के सभी है कि मूल्यों को योग करने के लिए लक्ष्य है, केवल पता चलता है जब 1 के मान के बराबर है करने के लिए लक्ष्य द्वारा ही है ।
Alex Triece

इसके अतिरिक्त, इस मुद्दे को हो सकता है कि दशमलव मैं का उपयोग कर रहा हूँ बहुत छोटे होते हैं (में .0031 और .0001 रेंज). मैंने देखा जब मैं प्रतिस्थापित उदाहरण डेटा दशमलव के साथ इस तरह इसे लौटा खाली सरणियों. किसी भी विचार है?
Alex Triece

के लिए पहली समस्या, मैं लगता है कि आप कोई भी मूल्यों में target स्तंभ । इस के लिए मैं अद्यतन करेगा जवाब लौटने के लिए एक खाली सरणी अगर ऐसा होता है ।
Nithish

आप बिल्कुल सही थे के बारे में है कि पहला मुद्दा है । बदल ना करने के लिए 0 और यह ठीक काम करता है. हालांकि, यह नहीं पढ़ा छोटे दशमलव. मैं ठीक हूँ के 0 के लक्ष्य में स्तंभ है, तो कोई ज़रूरत नहीं करने के लिए बहुत अधिक समय खर्च उस मुद्दे पर, जब तक आप चाहते हैं के लिए दूसरों के लिए' खातिर.
Alex Triece

कोड में जवाब है अब na या null सुरक्षित. परिशुद्धता के लिए मैं एक उदाहरण की जरूरत है, मैं करने की कोशिश की के लिए छोटे पर्वतमाला भी दशमलव 6 अंक और यह अभी भी काम करता है । एक उदाहरण के लिए मदद को दोहराने ।
Nithish

बस बदल गया है ऊपर के उदाहरण को दिखाने के लिए मैं क्या देख रहा हूँ, वास्तव में सिर्फ पहली पंक्ति. जब मैं इस प्लग में, मैं सही परिणाम प्राप्त सब कुछ के लिए छोड़कर शीर्ष पंक्ति.
Alex Triece

समस्या का कारण है करने के लिए चल बिन्दु परिशुद्धता और त्रुटि, अजगर में 0.0001 + 0.0031 है 0.0031999999999999997 stackoverflow.com/questions/11950819/python-math-is-wrong/..., मैं अद्यतन के साथ जवाब का समर्थन करने के लिए सटीक गणित का समर्थन करने के लिए अपने usecase.
Nithish

धन्यवाद, कि मदद करता है । हालांकि, यह एक त्रुटि फेंकता के साथ दशमलव() समारोह. वहाँ कुछ है कि जरूरतों के लिए आयात किया जा करने के लिए है कि मान्यता प्राप्त हो?
Alex Triece

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में