Spark如何从一行中仅提取Json数据-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

Spark如何从一行中仅提取Json数据

社区小助手 2018-12-05 14:47:25 1664

我有一堆文件,每行代码如下:

some random non json stuff here {"timestmap":21212121, "name":"John"}
我无法将这些文件作为json读取,因为Json数据之前存在随机的东西。

清除随机内容以便能够将Json数据加载到具有适当列的DF中的最佳方法是什么?

最终目标是使最终DF只包含时间戳在特定日期之间的数据。

JSON 分布式计算 数据格式 Spark
分享到
取消 提交回答
全部回答(1)
  • 社区小助手
    2019-07-17 23:18:23

    此解决方案使用

    instr找到JSON curly braces的出现{and}
    substr 获取JSON curly braces之间的子串(JSON文本)
    然后它使用from_json定义预期JSON结构的模式。

    from pyspark.sql.functions import from_json, instr
    from pyspark.sql.types import *

    Expected JSON schema

    schema = StructType([StructField("timestmap", TimestampType()),

                     StructField("name", StringType())])

    Filtering and parsing

    parsed = df.select(from_json(

                df.value.substr(instr(df.value, '{'), instr(df.value, '}')), 
                schema).alias("json"))
    

    Don't know if it's possible to do it in one step ...

    parsed = parsed.select(F.col("json.timestmap").alias("timestmap"),

                       F.col("json.name").alias("name"))
    

    parsed.printSchema()
    parsed.show()
    结果是

    root
    |-- timestmap: timestamp (nullable = true)
    |-- name: string (nullable = true)

    timestmap name
    1970-09-03 12:15:21 John
    1970-09-03 12:15:22 Doe

    示例文本文件random.txt是

    some random non json stuff here {"timestmap":21212121, "name":"John"}
    some other random non json stuff here {"timestmap":21212122, "name":"Doe"}

    0 0
大数据
使用钉钉扫一扫加入圈子
+ 订阅

大数据计算实践乐园,近距离学习前沿技术

推荐文章
相似问题