c++解析json_Spark处理损坏json文件

60702d28d15d581de20e1656ebd7d873.png

通常用spark读取json文件的时候,用的是

spark.read.json(path)


这种方式进行读取,但是,当json文件某一行有损坏的情况下,则会出现解析失败,导致schema解析错误的情况,可能会遇到这种错误

Found duplicate column(s) in the data schema


百度和google了很多,有人说加入

spark.read.option("mode","DROPMALFORMED")


但是在我的数据下并没有用。
然后我想出2个解决方案。
第一个是用fastjson,来逐行解析,丢掉解析失败的行。
第二个是用spark中指定schema的方式来解析。
最终我采取了第二种方式。
具体如下,我只将代码重要部分提取,其他业务部分省略:

import org.apache.spark.sql.types._

    val schema_1 = StructType(
        List(
            StructField("field_a", LongType),
            StructField("field_b", LongType),
            StructField("field_c", LongType),
            StructField("field_d", ArrayType(StringType))
        )
    )

    val schema_2 = StructType(
        List(
            StructField("field_e", LongType),
            StructField("field_f", LongType),
            StructField("field_g", LongType),
            StructField("field_h", ArrayType(StringType))
        )
    )
 
    val schema = StructType(
        List(
            StructField("schema_1", schema_1),
            StructField("schema_2", schema_2)
        )
    )

    val df = spark.read.schema(schema).json(path)


这种方式有优点,也有缺点:
优点是,若不加schema,则spark.read.json方式则需要扫2遍所有json文件,第一遍扫schema,第二遍解析。加入schema,则只需要扫一遍,第一遍扫schema跳过。
缺点是,增加了维护成本,若加入了一些字段,则这里则需要同步修改。
如有遇到同样问题的朋友们,有新的解决方案,欢迎交流。

0da29f8a205b15403ef398b0c2de6fb0.png
关注公众号:算法工厂
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值