因此,我需要创建一个数字数组,从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))
答案 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]|
+---+-------------------------------+