簡體   English   中英

從 json 字符串推斷模式

[英]Infer schema from json string

我有這個 dataframe:

cSchema = StructType([StructField("id1", StringType()), StructField("id2", StringType()), StructField("params", StringType())\
                      ,StructField("Col2", IntegerType())])

test_list = [[1, 2, '{"param1": "val1", "param2": "val2"}', 1], [1, 3, '{"param1": "val4", "param2": "val5"}', 3]]

df = spark.createDataFrame(test_list,schema=cSchema) 

+---+---+--------------------+----+
|id1|id2|              params|Col2|
+---+---+--------------------+----+
|  1|  2|{"param1": "val1"...|   1|
|  1|  3|{"param1": "val4"...|   3|
+---+---+--------------------+----+

我想將參數分解成列:

+---+---+----+------+------+
|id1|id2|Col2|param1|param2|
+---+---+----+------+------+
|  1|  2|   1|  val1|  val2|
|  1|  3|   3|  val4|  val5|
+---+---+----+------+------+

所以我編碼了這個:

schema2 = StructType([StructField("param1", StringType()), StructField("param2", StringType())])

df.withColumn(
  "params", from_json("params", schema2)
).select(
  col('id1'), col('id2'),col('Col2'), col('params.*')
).show()

問題是params schema 是動態的(可變schema2 ),他可能會從一個執行更改為另一個執行,所以我需要動態地推斷模式(所有列都具有 String 類型是可以的)......我想不通無法做到這一點..

誰能幫我解決這個問題?

這是你可以做到的,希望你能把它改成python

使用schema_of_json從值中動態獲取模式,並使用from_json進行讀取。

val schema = schema_of_json(df.first().getAs[String]("params"))
df.withColumn("params", from_json($"params", schema))
  .select("id1", "id2", "Col2", "params.*")
  .show(false)

在 Pyspark 中,語法應該是:

import pyspark.sql.functions as F
schema = F.schema_of_json(df.select('params').head()[0])

df2 = df.withColumn(
  "params", F.from_json("params", schema)
).select(
  'id1', 'id2', 'Col2', 'params.*'
)

df2.show()
+---+---+----+------+------+
|id1|id2|Col2|param1|param2|
+---+---+----+------+------+
|  1|  2|   1|  val1|  val2|
|  1|  3|   3|  val4|  val5|
+---+---+----+------+------+

如果你想獲得更大的數據樣本進行比較,你可以將 params 字段讀入列表,將其轉換為 RDD,然后使用“spark.read.json()”讀取

params_list = df.select("params").rdd.flatMap(lambda x: x).collect()
params_rdd = sc.parallelize(params_list)
spark.read.json(params_rdd).schema

需要注意的是,您可能不想加載太多數據,因為它們都被塞進了局部變量。 嘗試取前 1000 名或任何合適的樣本量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM