如何使用SparkSession动态推断模式

时间:2019-08-12 07:13:03

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

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

有可能这样做吗?

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

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

1 个答案:

答案 0 :(得分: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)