【问题标题】:Flattening Rows in SparkSpark中的扁平化行
【发布时间】:2023-04-07 08:20:01
【问题描述】:

我正在使用 scala 对 spark 进行一些测试。我们通常读取需要操作的json文件,如下例:

test.json:

{"a":1,"b":[2,3]}
val test = sqlContext.read.json("test.json")

如何将其转换为以下格式:

{"a":1,"b":2}
{"a":1,"b":3}

【问题讨论】:

    标签: scala apache-spark apache-spark-sql distributed-computing


    【解决方案1】:

    你可以使用explode函数:

    scala> import org.apache.spark.sql.functions.explode
    import org.apache.spark.sql.functions.explode
    
    
    scala> val test = sqlContext.read.json(sc.parallelize(Seq("""{"a":1,"b":[2,3]}""")))
    test: org.apache.spark.sql.DataFrame = [a: bigint, b: array<bigint>]
    
    scala> test.printSchema
    root
     |-- a: long (nullable = true)
     |-- b: array (nullable = true)
     |    |-- element: long (containsNull = true)
    
    scala> val flattened = test.withColumn("b", explode($"b"))
    flattened: org.apache.spark.sql.DataFrame = [a: bigint, b: bigint]
    
    scala> flattened.printSchema
    root
     |-- a: long (nullable = true)
     |-- b: long (nullable = true)
    
    scala> flattened.show
    +---+---+
    |  a|  b|
    +---+---+
    |  1|  2|
    |  1|  3|
    +---+---+
    

    【讨论】:

    • 谢谢,这在 shell 中效果很好。但是,当我在 Intellij 中尝试此操作时,尝试使用 $"b" 引用列 b 时出现错误。你知道如何解决这个问题吗?
    • 试试import sqlContext.implicits._。您也可以使用org.apache.spark.sql.functions.col 并申请DataFrame (df("b"))
    • 如果 sqlContext.implicits._ 对您不起作用,请在范围内尝试 import spark.implicits._。您可能还需要import org.apache.spark.sql.functions.explode
    猜你喜欢
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    相关资源
    最近更新 更多