创建一个新列,其中包含一系列数字的数组

9

我需要创建一个数字数组,列出从1到100的每一行作为额外的列。

使用 array() 函数与大量文本值可以工作,但肯定有一种方法可以使用/转换Scala Range(a到b),而不是单独列出每个数字吧?

spark.sql("SELECT key FROM schema.table")
  .otherCommands
  .withColumn("range", array(lit(1), lit(2), ..., lit(100)))

转化为:

withColumn("range", array(1 to 100))
5个回答

9
从Spark 2.4版本开始,您可以使用[sequence][1]函数。 如果您有这个数据框架:
df.show()
+--------+
|column_1|
+--------+
|       1|
|       2|
|       3|
|       0|
+--------+

如果你使用从0到column_1的序列函数,你会得到以下结果:

df.withColumn("range", sequence(lit(0), col("column_1"))).show()
+--------+------------+
|column_1|       range|
+--------+------------+
|       1|      [0, 1]|
|       2|   [0, 1, 2]|
|       3|[0, 1, 2, 3]|
|       0|         [0]|
+--------+------------+

对于这种情况,使用lit设置两个值:

df.withColumn("range", sequence(lit(0), lit(100)))

5
您可以在array函数中使用内置函数lit,使用map函数。
df.withColumn("range", array((1 to 100).map(lit(_)): _*))

3
对于Spark 2.2+,引入了一个名为typedLit的新函数,它可以轻松解决这个问题,而不需要在数组上使用.map(lit(_))。从文档中可以看到:

此函数与lit之间的区别在于,此函数可以处理参数化的scala类型,例如:List、Seq和Map。

使用方法如下:
import org.apache.spark.sql.functions.typedLit

df.withColumn("range", typedLit((1 to 100).toList))

0
在涉及到 PySpark 的情况下:
from pyspark.sql import functions as F
DF.withColumn("range",F.array([F.lit(i) for i in range(1,11)]))

希望以上回答有所帮助。


-2

已使用Spark版本2.2.0测试了此解决方案。

请尝试这种简单的方式来实现相同的功能:

val df = spark.range(5).toDF("id")
df.withColumn("range", lit(1 to 10 toArray)).show(false)

代码的输出结果:
+---+-------------------------------+
|id |range                          |
+---+-------------------------------+
|0  |[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]|
|1  |[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]|
|2  |[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]|
|3  |[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]|
|4  |[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]|
+---+-------------------------------+

这个不起作用:java.lang.RuntimeException: Unsupported literal type class [I [I@427a0746 - ChiMo
我在发布之前测试了解决方案。以下是相应的输出。val df = spark.range(5).toDF("id") df.withColumn("range", lit(1 to 10 toArray)).show(false) - Bhima Rao Gogineni
已添加了相应的输出 @ChiMo - Bhima Rao Gogineni
我正在使用Spark版本2.0.2.6,也许您对哪些版本支持它有评论。 - ChiMo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接