Spark 2.0 将 json 读入带有引号的数据帧中 - 与 spark 1.6 不同的行为......错误?

Posted

技术标签:

【中文标题】Spark 2.0 将 json 读入带有引号的数据帧中 - 与 spark 1.6 不同的行为......错误?【英文标题】:Spark 2.0 reading json into a dataframe with quotes in a key - different behaviour than spark 1.6... bug? 【发布时间】:2016-08-10 19:56:54 【问题描述】:

不幸的是,我们不得不处理杂乱的传入 json 数据,并且发现 Spark 2.0 (pyspark) 在 json 键中处理引号的方式有所不同。

如果我们使用以下作为示例文件(sample.json):

"event":"abc"
"event":"xyz","otherdata[\"this.is.ugly\"]":"value1"

在 Spark 1.6.2 中,我们可以运行以下命令并获得结果:

from pyspark import  SparkConf
from pyspark.sql import SQLContext
conf = SparkConf()
conf.setAppName('temp_quotes')

sc = SparkContext(conf=conf)
sqlContext = SQLContext(sc)

data =     sqlContext.read.json("sample.json")
data.printSchema()

结果是:

root
 |-- event: string (nullable = true)
 |-- otherdata["this.is.ugly"]: string (nullable = true)

我们可以在做节目时看到数据:

data.show(2)

+-----+-------------------------+
|event|otherdata["this.is.ugly"]|
+-----+-------------------------+
|  abc|                     null|
|  xyz|                   value1|
+-----+-------------------------+

但是,在 Spark 2.0 中运行相同的代码会显示相同的架构:

from pyspark import  SparkConf
from pyspark.sql import SQLContext
conf = SparkConf()
conf.setAppName('temp_quotes')

sc = SparkContext(conf=conf)
sqlContext = SQLContext(sc)

data =     sqlContext.read.json("sample.json")
data.printSchema()

root
 |-- event: string (nullable = true)
 |-- otherdata["this.is.ugly"]: string (nullable = true)

但是演出失败了:

data.show(2)

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/spark/python/pyspark/sql/dataframe.py", line 287, in show
    print(self._jdf.showString(n, truncate))
  File "/usr/lib/spark/python/lib/py4j-0.10.1-src.zip/py4j/java_gateway.py", line 933, in __call__
  File "/usr/lib/spark/python/pyspark/sql/utils.py", line 69, in deco
    raise AnalysisException(s.split(': ', 1)[1], stackTrace)
pyspark.sql.utils.AnalysisException: u'Unable to resolve otherdata["this.is.ugly"] given [event, otherdata["this.is.ugly"]];'

这是一个错误还是 Spark 2.0 中缺少我缺少的参数?

【问题讨论】:

【参考方案1】:

我相信这在https://issues.apache.org/jira/browse/SPARK-16698(JSON 键中的点)中得到了解决。该修复程序计划在 2.0.1 中发布

(我没有足够的声誉来发表评论)

【讨论】:

以上是关于Spark 2.0 将 json 读入带有引号的数据帧中 - 与 spark 1.6 不同的行为......错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何将字符串中带有双引号的json文件加载到spark scala中的数据框中

将 json 文件读入 Spark DataFrame

如何在 Spark Scala 中读取带有根元素的多行 json?

读取带有模式的 JSON 数组字符串返回 null spark 2.2.0

将 JSON 文件读入 Spark 时出现 _corrupt_record 错误

Spark SQL 读取已转义双引号的 JSON 文件