【问题标题】:Convert spark dataframe to json using scala使用 scala 将 spark 数据帧转换为 json
【发布时间】:2019-10-29 14:42:05
【问题描述】:

我有以下格式的数据框

ID  currency   account name    principal   interest
123    USD     Principal       1000        100
123    EUR     Principal       2000        50
123    USD     Interest        2000        100

我想要以下格式的 json 输出:

{ 
       "id":"123",
       "principal_type":{ 
          "USD":1000,
          "EUR":2000
       },
       "interest_type":{ 
          "USD":100
       }
    }

由于前两行的帐户类型为 Principal,因此它被添加到本金类型中,而第三行的类型为 Interest,因此它被添加到 interest_type 中,键是货币,值是 Principal 或 Interest,具体取决于类型

【问题讨论】:

  • 似乎是某种“分组依据”——也许可以从中找到其他问题/示例。

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


【解决方案1】:

你可以试试这个spark

scala> var dfdd = Seq((123,"USD","Principal" ,1000,100),(123,"EUR","Principal",2000,50),(123,"USD","Interest",2000,100)).toDF("ID","currency","account_name","principal","interest")

scala> dfdd.show()
+---+--------+------------+---------+--------+
| ID|currency|account_name|principal|interest|
+---+--------+------------+---------+--------+
|123|     USD|   Principal|     1000|     100|
|123|     EUR|   Principal|     2000|      50|
|123|     USD|    Interest|     2000|     100|
+---+--------+------------+---------+--------+
scala> var dfdd2 = dfdd.groupBy("ID","account_name").pivot("currency").agg(collect_list("principal"))
+---+------------+------+------+
| ID|account_name|   EUR|   USD|
+---+------------+------+------+
|123|    Interest|    []|[2000]|
|123|   Principal|[2000]|[1000]|
+---+------------+------+------+
//added .show() only for understanding purpose
scala> var dfdd3 = dfdd2.withColumn("account_type",struct($"account_name",$"EUR",$"USD")).drop("EUR","USD","account_name").groupBy("id").agg(collect_list("account_type").as("test"))


scala> dfdd3.toJSON.show(false)
+----------------------------------------------------------------------------------------------------------------------------+
|value                                                                                                                       |
+----------------------------------------------------------------------------------------------------------------------------+
|{"id":123,"test":[{"account_name":"Interest","EUR":[],"USD":[2000]},{"account_name":"Principal","EUR":[2000],"USD":[1000]}]}|
+----------------------------------------------------------------------------------------------------------------------------+

与您想要的输出相同的 JSON 格式

如果您有任何与此相关的问题,请查看并告诉我

【讨论】:

  • 是否可以得到我上面在评论中提到的结构,而不是数组结构,以便键是货币,值是数字
  • 你有问题,但我在这里使用 collect_set 所以它总是会以数组的形式给出结果。
猜你喜欢
  • 2021-05-11
  • 1970-01-01
  • 2018-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-16
  • 1970-01-01
相关资源
最近更新 更多