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相似。因此删除了它。他的回答解决了你的问题吗?指定模式的问题是,你需要事先知道你将在数据中获得的所有字段/列。指定模式的问题是,你需要事先知道你将在数据中获得的所有字段/列。