추출물에서 값 배열하는 금액을 특정 가치 pyspark

0

질문

가 데이터 프레임 있는 배열을 가진 두 배로 값입니다. 배열 내에서,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

할 수 있습 로직을 캡슐화하는 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>=target:반환 난 오류가 발생 할 때 왼쪽에서:TypeError:'>='사이에 지원되지 않습의 인스턴스'int'과'NoneType'. 내가 이것을 밖으로 실행되지만,그것은 반환하지 않는 모든는 값의 합계를 대상만 보면 1 의 값이 같은지 대상으로 자체입니다.
Alex Triece

또한,이 문제가 될 수 있는 소수 나를 사용하는 훨씬 작은(에 .0031 및 .0001 범위). 나타났을 때 나는 교체 예 데이터와 같은 소수이 돌아 빈 배열입니다. 어떤 생각이에요?
Alex Triece

첫 번째 문제에 대한 생각이 없음 값 target 열입니다. 이를 위해 나는 것입 업데이트에 대한 답변을 빈 배열을 반환합니다 이런 일이 발생합니다.
Nithish

당신이 절대적으로 오른쪽에 대한 첫 번째 문제입니다. 변경 나의하 0 하고 있습니다. 그러나 그것을 읽지 않은 작은 소수. 나는 ok0 의 대상에서 열 필요가 없습니다 그래서 너무 많은 시간을 보내고 그 문제에 대하려는 경우가 아니면 다른 사람을 위해'습니다.
Alex Triece

코드에서는 답변이 지금 nanull 안전합니다. 정밀도를 위해야 할 필요가있다,예를 들어봤을 위한 작은 범위도 6 자리하고 그것은 여전히 작동합니다. 예를 들어 도움이 될 것이 복제됩니다.
Nithish

이지만 최고의 예를 보여 무엇을 보고 있는데요,정말 그 첫 번째 행이 있습니다. 때 나는 플러그인 이에,나는 정확한 결과를 제외한 모든 것합니다.
Alex Triece

문제로 인해 정밀 부동 소수점에 오류 Python 0.0001 + 0.00310.0031999999999999997 stackoverflow.com/questions/11950819/python-math-is-wrong/...,갱신하고 있는 응답을 지원하는 정밀 산술 지원하는 당신의 쓰임새.
Nithish

감사,는 도움이 됩니다. 그러나,그것은 오류가 발생과 함께 진수()함수입니다. 가 있는 뭔가가 될 필요가 수입에 대한 인식?
Alex Triece

다른 언어로

이 페이지는 다른 언어로되어 있습니다

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................