【问题标题】:How to dynamically infer a schema using SparkSession如何使用 SparkSession 动态推断模式
【发布时间】:2019-08-12 07:13:03
【问题描述】:

我刚刚开始学习 Spark。我知道如果我们将 inferSchema 选项设置为 true,则会自动推断架构。我正在阅读一个简单的 csv 文件。如何在我的代码中不指定任何自定义模式的情况下动态推断模式。该代码应该能够为任何传入数据集构建架构。

有可能吗?

我尝试使用 readStream 并将我的格式指定为 csv,完全跳过了 inferschema 选项,但似乎无论如何我都需要提供该选项。

 val ds1: DataFrame = spark
    .readStream
    .format("csv")
    .load("/home/vaibha/Downloads/C2ImportCalEventSample.csv")
  println(ds1.show(2))

【问题讨论】:

    标签: scala apache-spark apache-spark-sql


    【解决方案1】:

    您可以动态推断架构,但在某些 csv 格式的情况下可能会有点乏味。更多阅读here。在您的代码示例中引用 CSV 文件并假设它与 here 相同,如下所示将满足您的需求:

    scala> val df = spark.read.
     | option("header", "true").
     | option("inferSchema", "true").
     | option("timestampFormat","MM/dd/yyyy").
     | csv("D:\\texts\\C2ImportCalEventSample.csv")
    
    df: org.apache.spark.sql.DataFrame = [Start Date : timestamp, Start Time: string ... 15 more fields]
    
    scala> df.printSchema
    root
     |-- Start Date : timestamp (nullable = true)
     |-- Start Time: string (nullable = true)
     |-- End Date: timestamp (nullable = true)
     |-- End Time: string (nullable = true)
     |-- Event Title : string (nullable = true)
     |-- All Day Event: string (nullable = true)
     |-- No End Time: string (nullable = true)
     |-- Event Description: string (nullable = true)
     |-- Contact : string (nullable = true)
     |-- Contact Email: string (nullable = true)
     |-- Contact Phone: string (nullable = true)
     |-- Location: string (nullable = true)
     |-- Category: integer (nullable = true)
     |-- Mandatory: string (nullable = true)
     |-- Registration: string (nullable = true)
     |-- Maximum: integer (nullable = true)
     |-- Last Date To Register: timestamp (nullable = true)
    

    【讨论】:

    • 这是使用数据框的权利。我想打印我的架构而不是带有它们的值的整个文件。如何打印 RDD 模式。对于数据框,它就像 df.printSchema() 一样简单。有什么方法可以打印 RDD 的架构而不将其转换为数据框。
    • @VaibhavSrivastava 不,没有数据框/数据集,仅通过创建 RDD 就无法推断架构。
    • 在这种情况下如何打印模式,我的意思是文件中的列名及其相关类型,而不是值。我的意思是像 Name:String Age:Integer 这样的输出。我如何使用数据框、数据集或 RDD 来做到这一点? PS:没有推断模式的帮助。
    猜你喜欢
    • 1970-01-01
    • 2023-02-05
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    • 2017-01-31
    • 2020-03-17
    相关资源
    最近更新 更多