配置模式推理和进化自动加载程序

您可以配置自动加载程序加载数据的自动检测模式,允许您初始化表没有显式地声明数据模式和发展介绍了新列的表模式。这消除了需要手动跟踪和应用模式会随着时间而改变。

自动加载器也可以意想不到的“救援”数据(例如,不同的数据类型)在一个JSON blob列,您可以选择访问后使用半结构化数据访问api

支持以下格式模式推理和演化:

文件格式

支持版本

JSON

砖运行时8.2及以上

CSV

砖运行时8.3及以上

Avro

砖运行时10.2及以上

拼花

砖运行时11.1及以上

兽人

不支持的

文本

不适用(fixed-schema)

Binaryfile

不适用(fixed-schema)

语法模式推理和演化

指定目标目录的选项cloudFiles.schemaLocation使模式推理和演化。你可以选择使用你指定相同的目录中checkpointLocation。如果你使用三角洲生活表,砖自动管理模式位置和其他检查点信息。

请注意

如果你有一个以上的源数据位置被加载到目标表,每个汽车装载机摄入工作负载需要一个单独的流检查点。

下面的示例使用拼花cloudFiles.format。使用csv,avro,或json其他文件来源。所有其他设置读写保持不变每个格式的默认行为。

(火花readStream格式(“cloudFiles”)选项(“cloudFiles.format”,“铺”)#模式位置目录跟踪你的数据模式选项(“cloudFiles.schemaLocation”,“< path-to-checkpoint >”)负载(“< path-to-source-data >”)writeStream选项(“checkpointLocation”,“< path-to-checkpoint >”)开始(“< path_to_target”))
火花readStream格式(“cloudFiles”)选项(“cloudFiles.format”,“铺”)/ /数据的模式位置目录跟踪模式选项(“cloudFiles.schemaLocation”,“< path-to-checkpoint >”)负载(“< path-to-source-data >”)writeStream选项(“checkpointLocation”,“< path-to-checkpoint >”)开始(“< path_to_target”)

自动加载程序模式推理是如何工作的呢?

推断模式首先读取数据时,自动加载器样品第一个50 GB或1000个文件,它发现,无论限制是越过第一。自动加载程序将模式信息存储在一个目录_schemas在配置cloudfFiles.schemaLocation跟踪模式输入数据随着时间的变化。

请注意

改变大小的样本你可以设置使用SQL配置:

火花cloudFilesschemaInferencesampleSizenumBytes

例如,(字节字符串10 gb)

火花cloudFilesschemaInferencesampleSizenumFiles

(整数)

默认情况下,自动加载程序模式推理寻求避免模式演化问题由于类型不匹配。格式不编码数据类型(JSON和CSV),自动装载机推断所有列作为字符串(包括嵌套的JSON文件中的字段)。格式的输入模式(拼花和Avro),自动加载器样品的文件和一个子集合并单个文件的模式。这种行为是总结在下表中:

文件格式

默认的数据类型

JSON

字符串

CSV

字符串

Avro

在Avro模式类型编码

拼花

类型编码在铺模式

Apache火花DataFrameReader使用不同的行为模式推理,选择数据类型列JSON和CSV基于样本数据的来源。使这种行为与自动加载程序,设置选项cloudFiles.inferColumnTypes真正的

请注意

为CSV数据推断模式时,自动加载程序假定文件包含头文件。如果你的CSV文件不包含头文件,提供的选项.option(“头”,“假”)。此外,自动加载程序合并中的所有文件的模式样本想出一个全球模式。自动加载程序可以读取每个文件根据其头和解析CSV正确。

请注意

当一个列有不同的数据类型在两个拼花文件,自动加载器尝试向上的一种类型。如果向上转型是不可能的,数据推理失败。看到以下表为例:

1型

2型

向上的类型

int

字符串

字符串

int

结构体

推理失败

合并后的数据类型推断,文件包含记录加载未经选择的类型的获救的数据列推断,因为数据类型不同的模式。

自动加载程序模式演化是如何工作的呢?

自动加载器检测添加新列,因为它处理您的数据。当汽车加载程序检测到一个新列,与一个流停止UnknownFieldException。在你流抛出这个错误,自动加载程序上执行模式推理的最新micro-batch数据和更新最新的模式位置模式通过合并新列的模式。现有的列的数据类型不变。

砖建议配置自动加载程序流工作流这样的模式变化后自动重新启动。

自动加载程序支持以下模式演化模式,你在选项中设置cloudFiles.schemaEvolutionMode:

模式

行为阅读新列

addNewColumns(默认)

流失败。新列添加到模式。现有的列不进化数据类型。

救援

模式是没有进化和流不失败由于模式变化。记录在所有新列获救的数据列

failOnNewColumns

流失败。流不重启,除非提供的更新模式,或违规数据文件被删除。

没有一个

忽略不进化的模式,新列,和数据不是获救,除非rescuedDataColumn选项设置,流不失败由于模式变化。

分区使用自动加载程序如何?

自动加载程序试图推断出分区列从底层数据,如果数据的目录结构是在蜂巢风格划分。例如,文件路径base_path /事件= = 2021-04-01 / f0.json点击/日期推理的结果日期事件分区列。如果底层的目录结构包含矛盾的蜂巢分区或不包含蜂巢风格分区,分区列将被忽略。

二进制文件(binaryFile),文本文件格式有固定的数据模式,但支持分区列推理。砖建议设置cloudFiles.schemaLocation这些文件格式。这避免了任何潜在的错误或信息丢失,防止推理分区列每一次汽车加载程序就开始了。

分区列不考虑模式演化。如果你有一个初始目录结构base_path /事件= = 2021-04-01 / f0.json点击/日期,然后开始接收新文件base_path /事件=点击/日期= 1 / f1.json = 2021-04-01 /小时、自动加载程序忽略了小时列。为新的分区列来捕捉信息,设置cloudFiles.partitionColumns事件、日期、小时

请注意

的选项cloudFiles.partitionColumns需要一个以逗号分隔的列名。只列存在键=值对你的目录结构解析。

获救的数据列是什么?

当汽车装载机推断模式,救出了数据列是自动添加到您的模式_rescued_data。您可以重命名列或包括在这种情况下,你提供了一个模式通过设置选项rescuedDataColumn

获救的数据列确保列模式不匹配的拯救,而不是下降。获救的数据列不包含任何数据分析有以下原因:

  • 列是失踪的模式。

  • 类型不匹配。

  • 不匹配。

获救的列包含获救的JSON数据列和源文件路径的记录。

请注意

JSON解析记录时和CSV解析器支持三种模式:宽容的,DROPMALFORMED,FAILFAST。一起使用时rescuedDataColumn、数据类型不匹配不导致记录被删除DROPMALFORMED模式或抛出一个错误FAILFAST模式。只有腐败记录下降或抛出错误,如不完整或畸形的JSON或CSV。如果你使用badRecordsPath当解析JSON或CSV数据类型不匹配,不能被视为坏记录时使用rescuedDataColumn。只有不完整的和畸形的JSON或CSV记录存储在badRecordsPath

改变大小写敏感的行为

除非启用区分大小写,列美国广播公司,美国广播公司,美国广播公司被认为是相同的列模式推理的目的。的选择是任意的,取决于采样数据。您可以使用模式提示执行这种情况下应该使用。一旦选择了和模式推断,自动加载程序没有考虑套管变异没有选择与模式一致。

获救的数据列启用,字段中指定其他比装载模式_rescued_data列。改变这种行为通过设置选项readerCaseSensitive错误,在这种情况下,以不区分大小写的方式自动加载器读取数据。

覆盖模式推理与提示

您可以使用模式提示执行模式信息,你知道,并期望在一个推断模式。当你知道一个特定的数据类型的列,或者如果你想选择一个更一般的数据类型(例如,一个而不是一个整数),您可以提供任意数量的提示对列数据类型为字符串使用SQL模式规范的语法,如以下:

选项(“cloudFiles.schemaHints”,“标签map < string, string >,版本int”)

看文档数据类型支持的数据类型列表。

如果一列不存在的流,您还可以使用模式暗示这一列添加到推断模式。

这里是一个例子,一个推断模式的行为模式提示。

推断模式:

| - - -日期:字符串|——数量:int |——user_info:结构| | - id:字符串| | -名称:字符串| |——罗伯特:字符串|——purchase_options:结构| |——delivery_address:字符串

通过指定以下模式提示:

选项(“cloudFiles.schemaHints”,”user_info日期日期。捐赠日期、purchase_options MAP < STRING, STRING >,时间戳”)

你会得到:

| - - -日期:字符串- >日期|——数量:int |——user_info:结构| | - id:字符串| | -名称:字符串| |——罗伯特:字符串- >日期|——purchase_options:结构- > map < string, string > |——时间:时间戳

请注意

数组和地图模式提示支持砖运行时9.1 LTS及以上。

这里的一个例子是一个推断模式和复杂的数据类型的行为模式提示。

推断模式:

| - - -产品:数组<字符串> |——地点:数组<字符串> |——用户:数组< struct > | |——用户。元素:结构| | | - id:字符串| | | -名称:字符串| | |——罗伯特:字符串| - id: map < string, string > |——名字:map < string, string > |——价格:map < string, string > |——折扣:map <结构、字符串> | | -折扣。关键:结构| | | - id:字符串| | -折扣。值:字符串|——描述:map < string, struct > | | - - -描述。关键:字符串| | - - -描述。价值:结构| | | -内容:int

通过指定以下模式提示:

选项(“cloudFiles.schemaHints”,”产品数组< INT >,位置。元素字符串,users.element。INT id, id MAP < STRING, INT >,名字。关键的INT,价格。INT值,discounts.key。id INT, descriptions.value。内容字符串”)

你会得到:

| - - -产品:数组<字符串> - >组< int > |——地点:数组< int > - >组<字符串> |——用户:数组< struct > | |——用户。元素:结构| | | - id:字符串- > int | | | -名称:字符串| | |——罗伯特:字符串| - id: map < string, string > - > map < string, int > |——名字:地图<字符串,字符串> - > < int,字符串> |——价格:map < string, string > - > map < string, int > |——折扣:map <结构、字符串> | | -折扣。关键:结构| | | - id:字符串- > int | | -折扣。值:字符串|——描述:map < string, struct > | | - - -描述。关键:字符串| | - - -描述。价值:结构| | | -内容:int - >字符串

请注意

只有当你使用模式提示提供一个模式来自动加载程序。提示是否可以使用模式cloudFiles.inferColumnTypes启用或禁用。