Apache spark 在执行pyspark查询时如何提取json的值
这是桌子的样子 我使用以下命令来提取:Apache spark 在执行pyspark查询时如何提取json的值,apache-spark,pyspark,apache-spark-sql,Apache Spark,Pyspark,Apache Spark Sql,这是桌子的样子 我使用以下命令来提取: query=""" select distinct userid, region, json_data from mytable where operation = 'myvalue' """ table=spark.sql(query) 现在,我只想提取列json_data中msg_id的值,该列是一个字符串列,预期输出如下: 如何更改上述代码中的查询以提取
query="""
select
distinct
userid,
region,
json_data
from mytable
where
operation = 'myvalue'
"""
table=spark.sql(query)
现在,我只想提取列json_data中msg_id的值,该列是一个字符串列,预期输出如下:
如何更改上述代码中的查询以提取json_数据
注:
json格式不固定,即可能包含其他字段,但我要提取的值始终带有msg_id
出于效率考虑,我希望在检索过程中实现这一点,尽管我可以检索json_数据并在之后对其进行格式化
您可以使用StructType和StructField语法或语法或使用schema_of_json指定模式,而不是读取文件以获取模式,如下所示:
df.show() #sampledataframe
#+------+------+-----------------------------------------+
#|userid|region|json_data |
#+------+------+-----------------------------------------+
#|1 |US |{"msg_id":123} |
#|2 |US |{"msg_id":123} |
#|3 |US |{"msg_id":123} |
#|4 |US |{"msg_id":123,"is_ads":true,"location":2}|
#|5 |US |{"msg_id":456} |
#+------+------+-----------------------------------------+
from pyspark.sql import functions as F
from pyspark.sql.types import *
schema = StructType([StructField("msg_id", LongType(), True),
StructField("is_ads", BooleanType(), True),
StructField("location", LongType(), True)])
#OR
schema= 'struct<is_ads:boolean,location:bigint,msg_id:bigint>'
#OR
schema= df.select(F.schema_of_json("""{"msg_id":123,"is_ads":true,"location":2}""")).collect()[0][0]
df.withColumn("json_data", F.from_json("json_data",schema))\
.select("userid","region","json_data.msg_id").show()
#+------+------+------+
#|userid|region|msg_id|
#+------+------+------+
#| 1| US| 123|
#| 2| US| 123|
#| 3| US| 123|
#| 4| US| 123|
#| 5| US| 456|
#+------+------+------+
您可以使用StructType和StructField语法或语法或使用schema_of_json指定模式,而不是读取文件以获取模式,如下所示:
df.show() #sampledataframe
#+------+------+-----------------------------------------+
#|userid|region|json_data |
#+------+------+-----------------------------------------+
#|1 |US |{"msg_id":123} |
#|2 |US |{"msg_id":123} |
#|3 |US |{"msg_id":123} |
#|4 |US |{"msg_id":123,"is_ads":true,"location":2}|
#|5 |US |{"msg_id":456} |
#+------+------+-----------------------------------------+
from pyspark.sql import functions as F
from pyspark.sql.types import *
schema = StructType([StructField("msg_id", LongType(), True),
StructField("is_ads", BooleanType(), True),
StructField("location", LongType(), True)])
#OR
schema= 'struct<is_ads:boolean,location:bigint,msg_id:bigint>'
#OR
schema= df.select(F.schema_of_json("""{"msg_id":123,"is_ads":true,"location":2}""")).collect()[0][0]
df.withColumn("json_data", F.from_json("json_data",schema))\
.select("userid","region","json_data.msg_id").show()
#+------+------+------+
#|userid|region|msg_id|
#+------+------+------+
#| 1| US| 123|
#| 2| US| 123|
#| 3| US| 123|
#| 4| US| 123|
#| 5| US| 456|
#+------+------+------+
@但由于错误无法从data324中提取值,它无法工作:需要结构类型,但得到字符串;第6行位置13我的回答与srikanth相似。因此删除了它。他的答案解决了你的问题吗?@rupeshedry由于错误而无法从数据中提取值324:需要结构类型,但得到字符串;第6行位置13我的回答与srikanth相似。因此删除了它。他的回答解决了你的问题吗?指定模式的问题是,你需要事先知道你将在数据中获得的所有字段/列。指定模式的问题是,你需要事先知道你将在数据中获得的所有字段/列。