【问题标题】:Pyspark JSON object or file to RDDPyspark JSON 对象或文件到 RDD
【发布时间】:2017-09-18 23:38:45
【问题描述】:

我是 PySpark 的新手,我有一个从 this link 获得的 AskReddit json 文件。我正在尝试创建一个 RDD,然后我希望执行诸如地图和平面地图之类的操作。有人建议我以 jsonlines 格式获取 json,但尽管使用 pip 安装 jsonlines,但我无法在 PySpark 笔记本中导入包。以下是我尝试在 json 中阅读的内容。

In [10]: import json

         data = json.load(open("AskReddit.json", "r"))
         jsonrdd = sc.parallelize(data)
         jsonrdd.take(5) 

Out[11]: [u'kind', u'data']

我还尝试执行以下操作,在执行 jsonrdd.take(1) 之后,它会为我提供 json 文件的全部内容。

In [6]: jsonrdd = sc.wholeTextFiles("*.json")
        jsonrdd.take(1)

但是,我想将每个 json 对象作为 rdd 中的一行。我该怎么办?

【问题讨论】:

    标签: python json pyspark rdd


    【解决方案1】:

    您可以使用 SparkSQL 的read.json 来读取文件,例如 -

    jdf = spark.read.json("path/to/AskReddit.json")
    

    并执行各种 sql 类型的操作,甚至是 rdd 类型的操作。但是 json 结构确实是嵌套的,没有固定的列可以用explode 之类的东西派生出来

    你最好使用read.json 并使用类似数据框 -

    jdf\
    .withColumn('after',jdf.data.after)\
    .withColumn('before',jdf.data.before)\
    .withColumn('modhash',jdf.data.modhash)\
    .withColumn('NestedKind',explode(jdf.data.children.kind))\
    .withColumn('subreddit',explode(jdf.data.children.data.subreddit))\
    .withColumn('clicked',explode(jdf.data.children.data.clicked))\
    .show()
    
    +--------------------+-------+---------+------+--------------------+----------+---------+-------+
    |                data|   kind|    after|before|             modhash|NestedKind|subreddit|clicked|
    +--------------------+-------+---------+------+--------------------+----------+---------+-------+
    |[t3_66qv3r,null,W...|Listing|t3_66qv3r|  null|3r7ao0m7qiadae13d...|        t3|AskReddit|  false|
    |[t3_66qv3r,null,W...|Listing|t3_66qv3r|  null|3r7ao0m7qiadae13d...|        t3|AskReddit|  false|
    

    【讨论】:

    • 有什么方法可以将每一行存储为一行,例如 jsonLines 格式?
    • 什么是火花对象?你能出示你的进口声明吗?
    • import pyspark.sql.*
    【解决方案2】:

    假设您使用的是 spark 2.0+,您可以执行以下操作:

    df = spark.read.json(filename).rdd
    

    查看pyspark.sql.DataFrameReader.json 的文档了解更多详情。请注意,此方法需要 JSON 行格式或换行分隔的 JSON,正如我相信您提到的那样。

    【讨论】:

    • 实际上我需要以 JSON 行格式获取它。我使用 pip install jsonlines。但是,当我尝试在运行 spark 的 jupyter notebook 中导入包时,它说没有找到模块,即使我可以在终端中运行 python 时导入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多