我正在从一个配置单元表中为下面的数据集构建一个模式。
处理后我必须将数据写入S3。
我需要根据附加日期的json图像格式重新构建和分组用户ID交互。
为了构建这个模式,我已经准备了一个带数组的结构类型。
fields = [
StructField("expUserId", StringType(), True),
StructField("recordDate", StringType(), True),
StructField("siteId", StringType(), True),
StructField("siteName", StringType(), True),
StructField("itineraryNumber", StringType(), True),
StructField("travelStartDate", StringType(), True),
StructField("travelEndDate", StringType(), True),
StructField("destinationID", StringType(), True),
StructField("lineOfBusiness", StringType(), True),
StructField("pageViewMap", MapType(StringType(),ArrayType(StructType([
StructField("PageId", StringType(), True),
StructField("count", LongType(), True)]))), True)
]
schema = StructType(fields)
return schema
这个架构是否正确?如何将DataFrame转换为以下json模式类型。
答案 0 :(得分:0)
为什么不使用SparkSession读取json使用schema
来显示解释结构?
spark.read.json(inputPath).schema
答案 1 :(得分:0)
如果您的数据集位于Hive中,请使用JDBC或Hive集成层阅读它(请参阅Spark官方文档中的Hive Tables或JDBC To Other Databases)。
分别如spark.read.format("jdbc")...load()
或spark.read.table
一样简单(请参阅官方文档中的DataFrameReader API)。
这种方法有什么好处,Spark可以自动为你推断出架构(所以你可以把它留下来,给自己留出更多时间!)
将数据集作为DataFrame
或Dataset
提供给您,您可以将其以JSON格式保存到S3,如下所示:
inventoryDF.write.format("json").save("s3n://...")
请参阅官方文档中的JSON Datasets和DataFrameWriter API。
我强烈建议让Spark尽一切努力让你不必这么做。
答案 2 :(得分:0)
您可以使用自己定义的架构从json创建新的数据框。
val myManualSchema = new StructType(Array(
new StructField("column1", StringType, true),
new StructField("column2", LongType, false)
))
val myDf = spark.read.format("json")
.schema(myManualSchema)
.load('/x/y/zddd.json')
可以创建数据框而无需手动指定架构。因此spark会通过评估输入文件来生成模式。
val df = spark.read.format("json").load("/x/y/zddd.json")
使用以下命令从json读取模式。
val SchJson = spark.read.format("json").load("/x/y/zddd.json").schema