在 pyspark 中添加带有压缩列表的新列作为常量值

Posted

技术标签:

【中文标题】在 pyspark 中添加带有压缩列表的新列作为常量值【英文标题】:Add new column with zipped list as a constant value in pyspark 【发布时间】:2020-04-06 03:55:20 【问题描述】:

我有 payspark 数据框,我想添加具有恒定值 x 的新列,它是压缩列表:

x = [('1', 'hello'),('2', 'Hi'),('3', 'Hello')]

但是当我运行这段代码时:

df = df.withColumn('case', x)

我收到此错误:

AssertionError: col should be Column

我怎样才能给这个列表提供结构来处理这个错误,我知道对于 int 或字符串值我们可以使用 Lit 函数,但是对于这种格式我不知道该怎么做。

【问题讨论】:

【参考方案1】:

您可以将 string literals 放入 structsarray

x = [('1', 'hello'),('2','Hi'),('3', 'Hello')]

df.withColumn("col1", F.array(*[F.struct(F.lit(i[0]),F.lit(i[1])) for i in x])).show(truncate=False)

+---------------------------------+
|col1                             |
+---------------------------------+
|[[1, hello], [2, Hi], [3, Hello]]|
|[[1, hello], [2, Hi], [3, Hello]]|
+---------------------------------+

Or,您创建 arrayarrays

x = [('1', 'hello'),('2','Hi'),('3', 'Hello')]

df.withColumn("col1", F.array(*[F.array(F.lit(i[0]),F.lit(i[1])) for i in x])).show(truncate=False)

+---------------------------------+
|col1                             |
+---------------------------------+
|[[1, hello], [2, Hi], [3, Hello]]|
|[[1, hello], [2, Hi], [3, Hello]]|
+---------------------------------+

Or,您可以以类似的方式使用 create_map

x = [('1', 'hello'),('2','Hi'),('3', 'Hello')]

df.withColumn("col1",F.array(*[F.create_map(F.lit(i[0]),F.lit(i[1])) for i in x])).show(truncate=False)

+---------------------------------------+
|col1                                   |
+---------------------------------------+
|[[1 -> hello], [2 -> Hi], [3 -> Hello]]|
|[[1 -> hello], [2 -> Hi], [3 -> Hello]]|
+---------------------------------------+

【讨论】:

效果很好,但是对于 pandas 数据框,我使用此列来应用功能,但在 pyspark 中它有问题,也许我应该更改我的 udf 中的输入类型,谢谢您的帮助

以上是关于在 pyspark 中添加带有压缩列表的新列作为常量值的主要内容,如果未能解决你的问题,请参考以下文章

PySpark:基于数据框中具有 UUID 的列添加新列

pyspark将列添加到列表中已经不存在的数据框

Pyspark:使用带有参数的UDF创建一个新列[重复]

在 IMPALA/HIVE 中添加带有 SELECT 的新列后,旧表数据变为 NULL

如何将字典中的值映射到 Pyspark 中的新列

pandas 中的新列 - 通过应用列表 groupby 将系列添加到数据框