如何在Hive表中为数据集创建架构?

时间:2017-05-09 08:31:49

标签: apache-spark pyspark apache-spark-sql apache-spark-dataset apache-spark-2.0

我正在从一个配置单元表中为下面的数据集构建一个模式。

enter image description here

处理后我必须将数据写入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模式类型。

3 个答案:

答案 0 :(得分:0)

为什么不使用SparkSession读取json使用schema来显示解释结构?

spark.read.json(inputPath).schema

答案 1 :(得分:0)

如果您的数据集位于Hive中,请使用JDBC或Hive集成层阅读它(请参阅Spark官方文档中的Hive TablesJDBC To Other Databases)。

分别如spark.read.format("jdbc")...load()spark.read.table一样简单(请参阅官方文档中的DataFrameReader API)。

这种方法有什么好处,Spark可以自动为你推断出架构(所以你可以把它留下来,给自己留出更多时间!)

将数据集作为DataFrameDataset提供给您,您可以将其以JSON格式保存到S3,如下所示:

inventoryDF.write.format("json").save("s3n://...")

请参阅官方文档中的JSON DatasetsDataFrameWriter 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