从列表中创建一个 pyspark 数据框列,其中列表的长度与数据框的行数相同

Posted

技术标签:

【中文标题】从列表中创建一个 pyspark 数据框列,其中列表的长度与数据框的行数相同【英文标题】:Making a pyspark dataframe column from a list where the length of the list is same as the row count of the dataframe 【发布时间】:2017-07-20 22:16:18 【问题描述】:

我有一个现有的 pyspark 数据框,它有 170 列和 841 行。我希望在其中添加另一列,即“字符串”列表。列表长度为 841,名称为 totals

  >>> totals
['165024392279', '672183', '1002643', '202292', '216254163906', '4698279464', '9247442818', '60093051178', '22208366804', '994475', '12174', '9404969384', '32118344368', '857443', '48544', '24572495416', '43802661492', '35686122552', '780813', '35414800642', '661474', '531615', '31962803064', '111295163538', '531671', '25776968294', '78538019255', '152455113964', '39305504103', '325507', '1028244', '82294034461', '715748', '12705147430', '678604', '90303771130', '1372443', '362131', '59079186929', '436218', '79528', '41366', '89254591311'...]

其中一种方法是创建一个新的数据框并将其与主数据框连接。

new_df = sqlContext.createDataFrame([Row(**'3G-fixated voice users':t)for t in totals])  

所以 new_df 有 1 列 841 行。并且它不能连接到原始数据框,因为没有可连接的公共列。

我能想到的另一种半生不熟的方法是使用文字。

from pyspark.sql.functions  import array,lit
totals=[str(t) for t in totals]
test_lit = array([array([lit(t) for t in tt]) for tt in totals])
big_df.withColumn('3G-fixated voice users',test_lit)

这会添加一个类型为

的新列
array<array<string>>

所有的值都只在第一行,这是不需要的。

当列表的长度与数据框中的行数相同时,有没有办法从列表中添加新列?

仍然是使用 pyspark 的新手

【问题讨论】:

【参考方案1】:

希望这会有所帮助!

from pyspark.sql.functions import monotonically_increasing_id
df = sc.parallelize([(1,2,3,4,5),(6,7,8,9,10),(16,17,18,19,20)]).toDF(['col1','col2','col3','col4','col5'])
df = df.withColumn("row_id", monotonically_increasing_id())

totals_df = sc.parallelize(['xxx','yyy','zzz']).map(lambda x: (x, )).toDF(['totals'])
totals_df = totals_df.withColumn("row_id", monotonically_increasing_id())

final_df = df.join(totals_df, df.row_id == totals_df.row_id)
final_df = final_df.select([c for c in final_df.columns if c not in 'row_id'])
final_df.show()

如果它解决了您的问题,请不要忘记告诉我们 :)

【讨论】:

以上是关于从列表中创建一个 pyspark 数据框列,其中列表的长度与数据框的行数相同的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SparkSession 从列表中创建数据框?

将列表转换为pyspark中的数据框列

PySpark - 将列表作为参数传递给 UDF + 迭代数据框列添加

在 PySpark Python 中减去两个日期列

如何对 pyspark 数据框列进行向量操作?

数据框列中的嵌套列表,提取数据框列中列表的值 Pyspark Spark