首页 > 解决方案 > 将 spark DataFrame 转换为每行的列表

问题描述

目前正在接收一个 spark 数据框并将其转换为 pandas 数据框以列出行。我想创建列表而不将其变成熊猫数据框。Function2 将函数应用于每一行的字符串表示。列名不会是恒定的。


def func1(df):
    df = df.select("*").toPandas()
    job_args = [(", ".join(str(i) for i in list(filter(None.__ne__, df.iloc[c].tolist())))) for c in range(0, len(df))]
    results = spark.sparkContext.parallelize(job_args).map(lambda n: function2(n)).collect()
    return results

例子:

+-----+-----+
|index|count|
+-----+-----+
|  1  |  5  |
|  2  |  9  |
|  3  |  3  |
|  4  |  1  |

变成

rows[0] = [1,5]
rows[1] = [2,9]
rows[2] = [3,3]
rows[3] = [4,1]

标签: pythonpandasapache-sparkapache-spark-sql

解决方案


如果目标是获取 spark 数据框中的所有列并将它们连接到一个字符串,那么您可以使用以下两个步骤来完成:

  1. 使用数组函数创建一个新的 col并将所有 cols 放入其中
  2. 使用array_join函数将元素连接到单个字符串

这是一个工作示例如何做到这一点:

import pyspark.sql.functions as f

l = [(1, 5), (2, 9), (3, 3), (4, 1)]
df = spark.createDataFrame(l, ['index', 'count'])

(
  df
  .withColumn('arr', f.array(df.columns))
  .withColumn('str', f.array_join('arr', ', '))
  .select('str')
).show()

+----+
| str|
+----+
|1, 5|
|2, 9|
|3, 3|
|4, 1|
+----+

推荐阅读