gpt4 book ai didi

json - 如何在 JSON : SPARK Scala 中使用 read.schema 仅指定特定字段

转载 作者:行者123 更新时间:2023-12-03 23:31:22 29 4
gpt4 key购买 nike

我正在尝试以编程方式在看起来像 json 的 textFile 上强制执行 schema(json)。我尝试使用 jsonFile 但问题是从 json 文件列表创建数据框,spark 必须对数据进行 1 次传递才能为数据框创建模式。所以它需要解析所有需要更长时间的数据(4小时,因为我的数据被压缩并且大小为 TB)。因此,我想尝试将其读取为 textFile 并强制执行架构以单独获取感兴趣的字段,以便稍后查询结果数据框。但我不确定如何将其映射到输入。有人可以给我一些关于如何将模式映射到像输入一样的 json 的引用。

输入:

这是完整的架构:

records: org.apache.spark.sql.DataFrame = [country: string, countryFeatures: string, customerId: string, homeCountry: string, homeCountryFeatures: string, places: array<struct<freeTrial:boolean,placeId:string,placeRating:bigint>>, siteName: string, siteId: string, siteTypeId: string, Timestamp: bigint, Timezone: string, countryId: string, pageId: string, homeId: string, pageType: string, model: string, requestId: string, sessionId: string, inputs: array<struct<inputName:string,inputType:string,inputId:string,offerType:string,originalRating:bigint,processed:boolean,rating:bigint,score:double,methodId:string>>] 

但我只对以下几个领域感兴趣:

res45: Array[String] = Array({"requestId":"bnjinmm","siteName":"bueller","pageType":"ad","model":"prepare","inputs":[{"methodId":"436136582","inputType":"US","processed":true,"rating":0,"originalRating":1},{"methodId":"23232322","inputType":"UK","processed":falase,"rating":0,"originalRating":1}]


val records = sc.textFile("s3://testData/sample.json.gz")

val schema = StructType(Array(StructField("requestId",StringType,true),
StructField("siteName",StringType,true),
StructField("model",StringType,true),
StructField("pageType",StringType,true),
StructField("inputs", ArrayType(
StructType(
StructField("inputType",StringType,true),
StructField("originalRating",LongType,true),
StructField("processed",BooleanType,true),
StructField("rating",LongType,true),
StructField("methodId",StringType,true)
),true),true)))

val rowRDD = ??

val inputRDD = sqlContext.applySchema(rowRDD, schema)
inputRDD.registerTempTable("input")

sql("select * from input").foreach(println)

有没有办法映射这个?还是我需要使用儿子解析器或其他东西。由于限制,我只想使用 textFile 。

试过了:

val  records =sqlContext.read.schema(schema).json("s3://testData/test2.gz")

但不断收到错误:

<console>:37: error: overloaded method value apply with alternatives:
(fields: Array[org.apache.spark.sql.types.StructField])org.apache.spark.sql.types.StructType <and>
(fields: java.util.List[org.apache.spark.sql.types.StructField])org.apache.spark.sql.types.StructType <and>
(fields: Seq[org.apache.spark.sql.types.StructField])org.apache.spark.sql.types.StructType
cannot be applied to (org.apache.spark.sql.types.StructField, org.apache.spark.sql.types.StructField, org.apache.spark.sql.types.StructField, org.apache.spark.sql.types.StructField, org.apache.spark.sql.types.StructField, org.apache.spark.sql.types.StructField)
StructField("inputs",ArrayType(StructType(StructField("inputType",StringType,true), StructField("originalRating",LongType,true), StructField("processed",BooleanType,true), StructField("rating",LongType,true), StructField("score",DoubleType,true), StructField("methodId",StringType,true)),true),true)))
^

最佳答案

它可以使用带有预定义架构的以下代码加载,spark 不需要通过 ZIP 文件中的文件。问题中的代码有歧义。

import org.apache.spark.sql.types._

val input = StructType(
Array(
StructField("inputType",StringType,true),
StructField("originalRating",LongType,true),
StructField("processed",BooleanType,true),
StructField("rating",LongType,true),
StructField("score",DoubleType,true),
StructField("methodId",StringType,true)
)
)

val schema = StructType(Array(
StructField("requestId",StringType,true),
StructField("siteName",StringType,true),
StructField("model",StringType,true),
StructField("inputs",
ArrayType(input,true),
true)
)
)

val records =sqlContext.read.schema(schema).json("s3://testData/test2.gz")

并非所有字段都需要提供。如果可能的话,最好提供所有东西。

如果某些行无效,Spark 会尽力解析所有内容。它将添加 _corrupt_record 作为包含整行的列。而如果它是普通的 json 文件文件。

关于json - 如何在 JSON : SPARK Scala 中使用 read.schema 仅指定特定字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38277317/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com