36. Spark 读取嵌套Json文件的方法

Spark 读取嵌套Json文件的方法

写此问题,我参考了很多现有的帖子说明,综合了各方的方法,我以我的实际操作过程,来说明使用哪种方法最为合适:

附参考网页

Stack Overflow:

How to read the multi nested JSON data in Spark [duplicate]
https://stackoverflow.com/questions/48663448/how-to-read-the-multi-nested-json-data-in-spark

BIG DATUMS

http://bigdatums.net/2016/02/12/how-to-extract-nested-json-data-in-spark/

砖厂 databricks

Complex and Nested Data

https://docs.databricks.com/spark/latest/dataframes-datasets/complex-nested-data.html

如下是我的探索过程:

给出一条嵌套json文件(关键信息,以模糊化处理,请理解),请关注读取过程

 

下面给出关键代码:

select(
trim($"container").alias("container_id"), 
trim($"type").alias("type"),
trim($"destination").alias("destination"),
//利用explode函数,把locations数组数据进行展开
explode($"locations").alias("locations")
)

结果如下

再读取locations内的嵌套数据,参考给出的方法 使用诸如 "locations.date" 或者 col("locations.date") 。Spark均提示有报错,提示

Can't extract value from locations#29

下面给出探索过程的代码截屏

 

提示报错

综合砖厂给出的方法,使用 get_json_object() 函数,成功提取locations的数据

给出关键代码

.select(
    $"container_id",
    $"type",
    $"destination",
    get_json_object($"locations", "$.date").alias("update_date"),
    get_json_object($"locations", "$.shipped").alias("shipped"),
    get_json_object($"locations", "$.port").alias("port"),
    get_json_object($"locations", "$.status").alias("status"),
    get_json_object($"locations", "$.vesselName").alias("vessel_name"),
    get_json_object($"locations", "$.voyage").alias("voyage"),
    get_json_object($"locations", "$.terminal").alias("terminal"),
    get_json_object($"locations", "$.country").alias("country")
)
.withColumn("id",row_number.over(Window.partitionBy(lit(1)).orderBy(lit(1))).cast(LongType) )
.withColumn("date_modified",lit(com.github.nscala_time.time.Imports.LocalDate.today.toDateTimeAtCurrentTime().toString()).cast("timestamp"))

得出的数据如下

所以,参考砖厂的官方文档最好。

https://docs.databricks.com/spark/latest/dataframes-datasets/complex-nested-data.html

 

此贴来自汇总贴的子问题,只是为了方便查询。

总贴请看置顶帖:

pyspark及Spark报错问题汇总及某些函数用法。

https://blog.youkuaiyun.com/qq0719/article/details/86003435

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值