Spark - 将包含特殊字符的字符串加载到 Spark 数据帧中

Spark - load string containing special characters into a Spark dataframe

提问人:punky 提问时间:8/7/2023 更新时间:8/7/2023 访问量:57

问:

我在这里有以下情况 - 我正在使用 urllib.request 库从 API 获取结果:

response = compatible_urllib.urlopen(request).read()

作为回应,我得到了以下字符串化JSON:

    response = '{"result":[{"kanalID":1,"kanal":"TV","kanalLongName":"TV","kanalNumber":"XTV1","thumbnail":"empty","externalID":1,"lastUpdate":"none"},{"kanalID":2,"kanal":"Mre\u017ea","kanalLongName":"Mre\u017ea","kanalNumber":"XTV2","thumbnail":"empty","externalID":2,"lastUpdate":"none"}]}'

问题出在字符串“Mre\u017ea”的一部分上,该字符串最终应该显示在数据库中,例如 - Mreža,因为 \u017e 是字符 ž 的表示形式。

我正在使用 Spark 数据帧处理来自 API 的结果,当我按以下方式执行时:

channels_json = ast.literal_eval(response)
df = spark.read.json(spark.sparkContext.parallelize([channels_json ]), schema=schema_struct)

作为 df,我在 dataframe 和数据库 (Hive) 中得到进一步的结果,但 \u017e 显示为 \\u017e。

有人建议我使用 json.loads 而不是 literal_eval,但是当我像这样使用它时:

    channels_json_b = json.loads(response)

channels_json_b的值为:

{u'result': [{u'lastUpdate': u'none', u'kanal': u'TV', u'kanalID': 1, u'kanalLongName': u'TV', u'externalID': 1, u'kanalNumber': u'XTV1', u'thumbnail': u'empty'}, {u'lastUpdate': u'none', u'kanal': u'Mre\u017ea', u'kanalID': 2, u'kanalLongName': u'Mre\u017ea', u'externalID': 2, u'kanalNumber': u'XTV100001608', u'thumbnail': u'empty'}]}

但是,如果我尝试将此JSON(channels_json_b)加载到数据帧中,则会得到空数据帧:

df = spark.read.json(spark.sparkContext.parallelize([channels_json_b]), schema=schema_struct)

在尝试将此 JSON 信息加载到数据帧之前,我是否需要执行其他操作? 我想问题不在我正在使用的模式中,因为当使用 literal_eval 而不是 json.loads 时,它可以正常工作

python json 数据帧 apache-spark utf-8

评论

0赞 punky 8/7/2023
我设法用literal_eval方法解决了这个问题,只需添加以下行 response = json.dumps(response, ensure_ascii=False).encode('utf8') 问题是由我的代码中的打印引起的,这导致了代码错误,并将我在检测解决方案时指向了错误的方向。

答: 暂无答案