【问题标题】:Split 1 row into multiple rows by range on 2 column values in scala在scala中按2列值的范围将1行拆分为多行
【发布时间】:2021-08-26 05:00:34
【问题描述】:

有没有人知道在 Scala 中根据两列的范围将一行分解为多行的好方法?

例如,对于输入数据框:

start_ip_int | end_ip_int | country | city
100          | 105        | USA     | Boston

预期的输出数据帧是:

start_ip_int | end_ip_int | country | city   | ip
100          | 105        | USA     | Boston | 100
100          | 105        | USA     | Boston | 101
100          | 105        | USA     | Boston | 102
100          | 105        | USA     | Boston | 103
100          | 105        | USA     | Boston | 104
100          | 105        | USA     | Boston | 105

所以这里根据start_ip_intend_ip_int 的列范围将一行分成6 行。

【问题讨论】:

    标签: scala dataframe apache-spark


    【解决方案1】:

    如果您使用的是Spark 2.4+,请使用sequence 和IP 整数范围作为参数来生成ArrayType 列,然后是explode-ing 它:

    val df = Seq((100, 105, "USA", "Boston")).
      toDF("start_ip_int", "end_ip_int", "country", "city")
    
    df.withColumn("ip", explode(sequence($"start_ip_int", $"end_ip_int"))).show
    // +------------+----------+-------+------+---+                                    
    // |start_ip_int|end_ip_int|country|  city| ip|
    // +------------+----------+-------+------+---+
    // |         100|       105|    USA|Boston|100|
    // |         100|       105|    USA|Boston|101|
    // |         100|       105|    USA|Boston|102|
    // |         100|       105|    USA|Boston|103|
    // |         100|       105|    USA|Boston|104|
    // |         100|       105|    USA|Boston|105|
    // +------------+----------+-------+------+---+
    

    对于较旧的 Spark 版本,请考虑创建一个简单的 UDF 来模仿 sequence 函数:

    val rangeSequence = udf{ (lower: Int, upper: Int) =>
      Seq.iterate(lower, upper - lower + 1)(_ + 1)
    }
    
    // Applying the UDF, followed by `explode`
    df.withColumn("ip", explode(rangeSequence($"start_ip_int", $"end_ip_int")))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多