【问题标题】:Spark -scala create DataFrame from json file and drop basic and nested elementsSpark -scala 从 json 文件创建 DataFrame 并删除基本和嵌套元素
【发布时间】:2018-10-30 11:42:21
【问题描述】:

我有一个包含 json 对象的 json 文件,每个对象逐行。 我有这些对象的以下架构:

root
   |-- endtime: long (nullable = true)
   |-- result: array (nullable = true)
   |    |-- element: struct (containsNull = true)
   |    |    |-- hop: long (nullable = true)
   |    |    |-- result: array (nullable = true)
   |    |    |    |-- element: struct (containsNull = true)
   |    |    |    |    |-- from: string (nullable = true)
   |    |    |    |    |-- rtt: double (nullable = true)
   |    |    |    |    |-- size: long (nullable = true)
   |    |    |    |    |-- ttl: long (nullable = true)
   |    |    |    |    |-- x: string (nullable = true)

问题:如何从 Dataframe 创建一个新的 DataFrame,其中包含作为输入提供的 json 文件中的数据,并将数据删除为 ttl 和 x?

   |    |    |    |    |-- ttl: long (nullable = true)
   |    |    |    |    |-- x: string (nullable = true)

鉴于我是 Spark (Scala) 的新手,我不知道有哪些可能的方法!

删除结束时间很简单:

val pathToTraceroutesExamples = getClass.getResource("/test/sample_1.json")
val df = spark.read.json(pathToTraceroutesExamples.getPath)

// Displays the content of the DataFrame to stdout
df.show()
df.printSchema()

var newDf = df.drop("endtime")

【问题讨论】:

    标签: json scala apache-spark


    【解决方案1】:

    explodedrop 可以解决问题。首先,explode 第一级结果,然后explode 来自结果数据帧的第二级结果。最后drop列。

    例如,

    val newDF = df
      .select(df(“*”), explode(df(“result”)).alias(“result_exp”))
      .drop(“ttl”).drop(“x”)
    

    【讨论】:

      【解决方案2】:

      @Kris 的想法是正确的;爆炸然后掉落。我找到了一个例子here

      我更改了属性名称结果,因为我有另一个结果名称以避免爆炸时的混乱:

      第 1 步:(输入)

       |-- timestamp: long (nullable = true)
       |-- hopDetails: array (nullable = true)
       |    |-- element: struct (containsNull = true)
       |    |    |-- hop: long (nullable = true)
       |    |    |-- result: array (nullable = true)
       |    |    |    |-- element: struct (containsNull = true)
       |    |    |    |    |-- from: string (nullable = true)
       |    |    |    |    |-- rtt: double (nullable = true)
       |    |    |    |    |-- size: long (nullable = true)
       |    |    |    |    |-- ttl: long (nullable = true)
      

      第 2 步: 代码:

          var exploded_1 = renamed_newDF
                   .withColumn("hop", explode(renamed_newDF("hopDetails.hop")))
                   .withColumn("result", explode(renamed_newDF("hopDetails.result")))
                   .drop("hopDetails")
          exploded_1.printSchema
      

      输出模式:

       |-- timestamp: long (nullable = true)
       |-- hop: long (nullable = true)
       |-- result: array (nullable = true)
       |    |-- element: struct (containsNull = true)
       |    |    |-- from: string (nullable = true)
       |    |    |-- rtt: double (nullable = true)
       |    |    |-- size: long (nullable = true)
       |    |    |-- ttl: long (nullable = true)
      

      第 3 步:

      代码:

      var exploded_2 = exploded_1
        .withColumn("from", explode(exploded_1("result.from")))
        .withColumn("rtt", explode(exploded_1("result.rtt")))
        .withColumn("size", explode(exploded_1("result.size")))
        .withColumn("ttl", explode(exploded_1("result.ttl")))
        .drop("result")
      
      exploded_2.printSchema
      

      架构:

          root
         |-- af: long (nullable = true)
         |-- dst_addr: string (nullable = true)
         |-- from: string (nullable = true)
         |-- msm_id: long (nullable = true)
         |-- prb_id: long (nullable = true)
         |-- src_addr: string (nullable = true)
         |-- timestamp: long (nullable = true)
         |-- hop: long (nullable = true)
         |-- rtt: double (nullable = true)
         |-- size: long (nullable = true)
         |-- ttl: long (nullable = true)
      

      【讨论】:

        猜你喜欢
        • 2019-08-19
        • 2015-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多