我从URI读取JSON,然后加载到数据框中:
(注意:我只需要名为“结果”的集合)
import requests
import json
from pyspark.sql.functions import from_json, to_json, get_json_object
from pyspark.sql.types import StringType, StructType, StructField,
schema= StructType([ \
StructField("id",StringType(),True) \
, StructField("client",StringType(),True) \
])
ss= StructType([ \
StructField("alias",StringType(),True) \
])
t= requests.get("https://.....")
j= json.loads(t.text)
x= str( j.get("results") ) # THE PROBLEMATIC VARIABLE
k= spark.sparkContext.parallelize( [x] )
df= spark.read.schema(schema).json(k)
df= df. withColumn("client_alias",get_json_object(to_json(from_json("client",ss)),"$.alias"))
df.show()
返回以下内容:
+----+------+------------+
| id|seller|client_alias|
+----+------+------------+
|null| null| null|
+----+------+------------+
如果我明确设置了这样的变量“ x”,则代码有效:
x= '[{"id":"101","client":{"id":"777","alias":"first"}},{"id":"202","client":{"id":"999","alias":"second"}}]'
输出:
+---+--------------------+------------+
| id| client|client_alias|
+---+--------------------+------------+
|101|{"id":"777","alia...| first|
|202|{"id":"999","alia...| second|
+---+--------------------+------------+
(实际数据当然还有更多的元素,但这表明问题出在数据中,而不是代码中)。
I找到了第一个解决方案:在原始代码中设置X后,请执行以下解决方案 - 一切都有效:
x= x.replace("': None","': null")
x= x.replace("': True","': true")
x= x.replace("': False","': false")
URI上的实际数据具有null
,true和False。请求在不更改数据的情况下检索数据。但是,在这些值之后,这些值转到none,
true,false 我找到了第二个解决方案,我认为这是正确的:用这个新的解决方案
json.loads()
用新的解决方案:x= str( j.get("results") )
所以问题是:为什么
x= json.dumps( j["results"] )
为什么更改null,true,
false值为none,true,false 是另一种更直接的方法吗? json是JavaScript对象符号 - 基于JavaScript对象的数据格式。 无效,true and false都存在于javaScript(和json)中。
json.loads()是一个python函数,可将json转换为python对象(或dict,如在python中称为python)。
没有,是不是,是上述JavaScript原语的python等效物。 null,python中不存在true and false,因此json.loads()需要转换它们。