Конвертировать массив в строку в pyspark - PullRequest
0 голосов
/ 10 апреля 2020

Это мой настоящий код, он работает нормально

df_train_taxrate = (
  df_train.groupby(
    'Company_code_BUKRS',
    'Vendor_Customer_Code_WT_ACCO',
    'Expense_GL_HKONT',
    'PAN_J_1IPANNO',
    'HSN_SAC_HSN_SAC'
  ).agg(
    f.collect_set('Section_WT_QSCOD').alias('Unique_Sectio_Code'),
    f.collect_set('WHT_rate_QSATZ').alias('Unique_Wtax_rate')
  )
)

Но проблема в том, что 'Section_WT_QSCOD, WHT_rate_QSATZ - это массивы, а при преобразовании массивов в строку я получаю ошибку ниже.

mycode:

df_train_taxrate = df_train.groupby(
    'Company_code_BUKRS',
    'Vendor_Customer_Code_WT_ACCO',
    'Expense_GL_HKONT',
    'PAN_J_1IPANNO',
    'HSN_SAC_HSN_SAC'
  ).agg(
    f.collect_set('Section_WT_QSCOD').withColumn(
      'Section_WT_QSCOD',                                           
      concat_ws(',', 'Unique_Sectio_Code')
    ),
    f.collect_set('WHT_rate_QSATZ').withColumn(
      'WHT_rate_QSATZ', 
      concat_ws(',', 'Unique_W_tax_rate')
    )
  )

Ошибка:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'Column' object is not callable

1 Ответ

0 голосов
/ 10 апреля 2020

Вам нужно использовать array_join вместо

Пример данных

import pyspark.sql.functions as F
data = [
    ('a', 'x1'),
    ('a', 'x2'),
    ('a', 'x3'),
    ('b', 'y1'),
    ('b', 'y2')
]
df = spark.createDataFrame(data, ['id', 'val'])

Решение

result = (
    df.
        groupby('id').
        agg(
            F.collect_set(F.col('val')).alias('arr_of_vals')
        ).
        withColumn(
            'arr_to_string',
            F.array_join(
                F.col('arr_of_vals'),
                ','
            )
        )
)
result
DataFrame[id: string, arr_of_vals: array<string>, arr_to_string: string]
result.show(truncate=False)
+---+------------+-------------+                                                
|id |arr_of_vals |arr_to_string|
+---+------------+-------------+
|b  |[y2, y1]    |y2,y1        |
|a  |[x1, x3, x2]|x1,x3,x2     |
+---+------------+-------------+
...