【问题标题】:How to create a schema for dataset in Hive table?如何为 Hive 表中的数据集创建模式?
【发布时间】:2017-05-09 08:31:48
【问题描述】:

我正在从 hive 表中为下面的数据集构建架构。

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

【问题讨论】:

  • 能否请您替换屏幕截图并使用复制原始文本。给你一些关于如何处理数据集的额外提示会容易得多。谢谢!

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


【解决方案1】:

您为什么不直接使用 SparkSession 读取 json 并使用 schema 来显示解释的结构?

spark.read.json(inputPath).schema

【讨论】:

    【解决方案2】:

    如果您的数据集在 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 完成繁重的工作,这样您就不必这样做了。

    【讨论】:

    • 感谢 Jacek,sqlContext.read.parquet('s3path') 和 df.printScema 工作
    • @Pradeep.D.s 好!当你有时间时,接受它作为答案(也许是赞成)。谢谢!
    【解决方案3】:

    您可以使用自己定义的架构从 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-07
      • 2021-12-19
      • 2023-02-20
      相关资源
      最近更新 更多