用数字范围数组创建新列

时间:2018-07-04 01:33:22

标签: arrays scala apache-spark apache-spark-sql

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

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

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

类似:

withColumn("range", array(1 to 100))

4 个答案:

答案 0 :(得分:1)

您可以将map函数内部的lit内置函数用作

来使用array函数
df.withColumn("range", array((1 to 100).map(lit(_)): _*))

答案 1 :(得分:1)

对于 Spark 2.2 + ,引入了一个新功能typedLit,可以轻松解决此问题,而无需在阵列上使用.map(lit(_))。从文档中:

  

此功能与点灯之间的区别在于此功能可以处理参数化的Scala类型,例如:List,Seq和Map。

用法如下:

import org.apache.spark.sql.functions.typedLit

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

答案 2 :(得分:0)

在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)))

答案 3 :(得分:-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]|
+---+-------------------------------+