【问题标题】:Adding a Arraylist value to a new column in Spark Dataframe using Pyspark [duplicate]使用 Pyspark 将 Arraylist 值添加到 Spark Dataframe 中的新列 [重复]
【发布时间】:2018-06-30 22:34:38
【问题描述】:

我想在现有数据框中添加一个新列。下面是我的数据框 -

+---+---+-----+
| x1| x2|   x3|
+---+---+-----+
|  1|  a| 23.0|
|  3|  B|-23.0|
+---+---+-----+

我可以像这样添加df = df.withColumn("x4", lit(0))

+---+---+-----+---+
| x1| x2|   x3| x4|
+---+---+-----+---+
|  1|  a| 23.0|  0|
|  3|  B|-23.0|  0|
+---+---+-----+---+

但我想在我的 df 中添加一个数组列表。

假设 [0,0,0,0] 是我要添加的数组,添加后我的 df 将如下所示 -

+---+---+-----+---------+
| x1| x2|   x3|       x4|
+---+---+-----+---------+
|  1|  a| 23.0|[0,0,0,0]|
|  3|  B|-23.0|[0,0,0,0]|
+---+---+-----+---------+

我试过这样 -

array_list = [0,0,0,0]
df = df.withColumn("x4", lit(array_list))

但是报错了

py4j.protocol.Py4JJavaError: An error occurred while calling z:org.apache.spark.sql.functions.lit.
: java.lang.RuntimeException: Unsupported literal type class java.util.ArrayList [0, 0, 0, 0, 0, 0]

有人知道怎么做吗?

【问题讨论】:

  • 也许是df.withColumn("some_array", array(lit(0), lit(0), lit(0), lit(0))src
  • 但是如果我必须向不同的行添加不同的值怎么办。这不是永久的解决方案。
  • 如果你需要一个不同的值到不同的行,那么你可能需要使用udf
  • 另一个想法是使用whendf.withColumn('some_array', when((df.some_column==1), array(lit(0), lit(0), lit(0), lit(0)).otherwise(array(lit(1), lit(1), lit(1), lit(1))
  • 你的数组依赖什么?

标签: apache-spark pyspark spark-dataframe pyspark-sql


【解决方案1】:

Based on your comment

我的数组是可变的,我必须将它添加到具有不同值的多个位置。这种方法适用于添加相同的值或添加一个或两个数组。它不适合添加大量数据

我认为这是一个 XY 问题。如果您想要可扩展的解决方案(说实话,1000 行并不大),那么使用另一个数据框并加入。例如如果想通过x1连接

arrays = spark.createDataFrame([
    (1, [0.0, 0.0, 0.0]), (3, [0.0, 0.0, 0.0])
], ("x1", "x4"))


df.join(arrays, ["x1"])

根据需求添加更复杂的条件。

要解决您的紧迫问题,请参阅 How to add a constant column in a Spark DataFrame? - array 的所有元素都应该是列

from pyspark.sql.functions import lit

array(lit(0.0), lit(0.0), lit(0.0))
#  Column<b'array(0.0, 0.0, 0.0)'>

【讨论】:

  • 很好明白了。但是还有一个问题,如果我想像这样为每一行添加不同的值怎么办 - +---+---+-----+---------+ | x1| x2| x3| x4| +---+---+-----+---------+ | 1| a| 23.0|[0,1,2,3]| | 3| B|-23.0|[4,5,0,7]| | 4| C|-23.0|[8,0,1,0]| +---+---+-----+---------+
猜你喜欢
  • 2016-02-14
  • 2021-11-25
  • 2017-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多