代码之家  ›  专栏  ›  技术社区  ›  ChiMo

使用数字范围数组创建新列

  •  2
  • ChiMo  · 技术社区  · 8 年前

    因此,我需要创建一个数字数组,将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))
    
    3 回复  |  直到 8 年前
        1
  •  1
  •   Ramesh Maharjan    8 年前

    你可以使用 map 函数使用 lit 内置函数 array 函数作为

    df.withColumn("range", array((1 to 100).map(lit(_)): _*))
    
        2
  •  1
  •   Shaido MadHadders    8 年前

    对于 火花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))
    
        3
  •  -2
  •   Bhima Rao Gogineni    8 年前

    在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]|
    +---+-------------------------------+