当我读取一些 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
我没有添加评论的声誉,因此添加作为答案。
我做了一些研究,并向我的同事询问了这一点,我了解到,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'\}$', ''))