如何在PySpark

时间:2018-02-10 22:25:50

标签: json azure pyspark rdd hdinsight

问题

当我尝试读取大型UTF-8 JSON阵列文件并切换到HDInsight PySpark(v2.x,而不是3)来处理文件时,我最近遇到了Azure Data Lake Analytics的挑战。该文件大约为110G,有大约150万个JSON对象。

HDInsight PySpark似乎不支持用于输入的JSON文件格式数组,所以我被卡住了。此外,我有很多"很多"这些文件在每个模式中包含不同的模式,每个模式包含数百列,因此此时创建模式不是一个选项。

问题

如何在HDInsight上使用PySpark 2中的开箱即用功能来将这些文件作为JSON读取?

谢谢,

Ĵ

我尝试过的事情

我使用了本页底部的方法: 提供以下代码段的from Databricks

import json

df = sc.wholeTextFiles('/tmp/*.json').flatMap(lambda x: json.loads(x[1])).toDF()
display(df)

我尝试了以上内容,而不是理解" wholeTextFiles"工作,当然遇到OutOfMemory错误,很快就杀死了我的执行者。

我尝试加载到RDD和其他开放方法,但PySpark似乎只支持JSONLines JSON文件格式,并且由于ADLA对该文件格式的要求,我有JSON对象数组。

我尝试将其作为文本文件读取,剥离数组字符,拆分JSON对象边界并转换为JSON,如上所述,但是仍然存在无法转换unicode和/或str(ings)的错误。 / p>

我找到了解决上述问题的方法,并将其转换为包含一列的数据框,其中包含一串JSON对象的字符串。但是,我没有找到一种方法只将JSON字符串从数据框行输出到输出文件。总是出现

{'dfColumnName':'{...json_string_as_value}'}

我还尝试了一个接受上述行的map函数,解析为JSON,提取值(我想要的JSON),然后将值解析为JSON。这似乎有效,但是当我尝试保存时,RDD是类型PipelineRDD并且没有saveAsTextFile()方法。然后我尝试了toJSON方法,但不断发现错误"找不到有效的JSON对象",我当然不理解,当然还有其他转换错误。

1 个答案:

答案 0 :(得分:0)

我终于找到了前进的方向。我了解到我可以直接从RDD读取json,包括PipelineRDD。我找到了一种方法来删除unicode字节顺序头,包装数组方括号,基于幸运分隔符拆分JSON对象,并有一个分布式数据集,以便更有效地处理。输出数据框现在具有以JSON元素命名的列,推断出模式,并动态地适应其他文件格式。

这是代码 - 希望它有所帮助!:

#...Spark considers arrays of Json objects to be an invalid format
#    and unicode files are prefixed with a byteorder marker
#
thanksMoiraRDD = sc.textFile( '/a/valid/file/path', partitions ).map(
    lambda x: x.encode('utf-8','ignore').strip(u",\r\n[]\ufeff") 
)

df = sqlContext.read.json(thanksMoiraRDD)