คลายแฟ้มค่าจากการตารางคู่ลำดับนั้นผลรวมเพื่อบางอย่างค่า pyspark

0

คำถาม

ฉันมี dataframe มันเป็นอาเรย์กับสองเท่าเช่นค่า. ภายในอาเรย์,1 หรือเป็นผลรวมของตัวเลขที่มีค่าเท่ากับบางอย่างเป้าหมายค่าและฉันจะทำการคลายแฟ้มไปไว้ที่ค่าเหมือนกันเท่ากับค่าหรือจะเป็น summed ต้อเท่ากับค่า. ฉันอยากจะเป็นสามารถทำเรื่องนี้อยู่ใน 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:'>='ไม่สนับสนุนระหว่างโหของ int'และ'NoneType'. ตอนที่ฉันเอามันออกมันวิ่งแต่มันยังไม่กลับมาทั้งหมดของค่าของมันซำไปที่เป้าหมายเดียวที่แสดงถึงตอนที่ 1 ของค่าของมันจะเท่ากับเป้าหมายโดยตัวมันเอง
Alex Triece

ยิ่งไปกว่านั้นปัญหาอาจจะเป็นคอีเมล์ฉันกำลังใช้เป็นกตัวเล็กลง(ใน .0031 และ .0001 ช่วง). ฉันสังเกตเห็นตอนที่ฉัน substituted งตัวอย่างเช่นข้อมูลกับอีเมล์แบบนี้มันกลับมาว่างเปล่า arrays. มีความคิดนั้น?
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ý
..................................................................................................................

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่