为什么 Pyspark 会更改 json 负载中的数字数据,即使我读取为字符串

问题描述 投票:0回答:1

当我读取一些 json 有效负载时,PySpark 正在更改数据,即使我将其作为 StringType 读取,并且我希望将其作为 String,因为我不想在此步骤将每个字段都作为一列。我只想将此有效负载作为字符串获取,就像它在有效负载/源文件中一样

本地我在 Jupiter Notebook 中使用 Spark 3.3 和 Glue 4 图像 PySpark 版本:3.3.0+amzn.1.dev0

这是我的有效负载/源(test.txt):

{"payload":{"points":1220000000}}
{"payload":{"count":1550554545.0}}
{"payload":{"points":125888002540.0, "count":1550554545.0}}
{"payload":{"name": "Roger", "count":55154111.0}}

这是我的代码:

path = "/home/glue_user/workspace/jupyter_workspace/test/test.txt"
schema =  StructType([StructField('payload', StringType(), True)])
my_df = spark.read.schema(schema).option("inferSchema", "false").json(path)
my_df.show(truncate=False)

这是 PySpark 以科学计数法设置浮点数的结果,即使我将其读取为字符串也是如此。

+------------------------------------------------+
|payload                                         |
+------------------------------------------------+
|{"points":1220000000}                           |
|{"count":1.550554545E9}                         |
|{"points":1.2588800254E11,"count":1.550554545E9}|
|{"name":"Roger","count":5.5154111E7}            |
+------------------------------------------------+

为什么我不能简单地拥有我的数据? 为什么最后的结果会变成我的字符串字段并收到这个科学记数法? 即:

“计数”:1550554545.0
“计数”:1.550554545E9

json pyspark schema scientific-notation
1个回答
0
投票

我没有添加评论的声誉,因此添加作为答案。

我做了一些研究,并向我的同事询问了这一点,我了解到,spark JSON 阅读器会自动推断模式,并且您无法覆盖它。 您可以做的就是先将其作为文本阅读,然后尝试隐藏值。

我在从 SQL DB 读取数据时遇到了同样的问题,并且我在查询本身中使用了强制转换表达式。

供您使用,这对我有用。我尝试使用 from_json、MapType、get_json_object 这三个,但我认为每当我们转换为 json 时,spark 都会转换为科学计数法。

df = spark.read.text(path)
df = df.withColumn('value', regexp_replace('value', r'^\{"payload":', ''))
df = df.withColumn('value', regexp_replace('value', r'\}$', ''))

Stack_over_flow 帖子解释了这一点

© www.soinside.com 2019 - 2024. All rights reserved.