10强大的功能来简化数据砖Lakehouse半结构化数据管理< /h1>
像专业人士那样摄取和查询复杂的JSON数据与三角洲湖和SQL< /div>
2021年11月11日
在工程的博客< /a>
摄入与半结构化数据和查询JSON可以繁琐,耗费时间,但汽车装载机和三角洲湖< /a>使它容易。JSON数据非常灵活,这使得它强大,但也很难摄取和查询。最大的挑战包括:< /p>
- 这是一个乏味的和脆弱的过程< /strong>定义一个模式被摄取的JSON文件。< /li>
- 可以随时间变化的模式< /strong>,你需要能够自动处理这些变化。< /li>
- 软件并不总是为您的数据选择正确的模式< /strong>,你可能需要暗示正确的格式。例如,32数量可以被解释为一个整数或一个长。< /li>
- 通常工程师没有控制上游数据源的数据生成半结构化数据< /strong>。例如,列名可能大写或小写,但表示相同的列,或者数据类型有时变化,你可能不想在三角洲湖已经完全重写摄入数据。< /li>
- 你可能不想做延展JSON文档的前期工作< /strong>提取每一列,这样做可能使数据很难使用。< /li>
- 在SQL查询半结构化数据是很难的< /strong>。您需要查询这些数据的方式很容易理解。< /li>
在本博客和附带的笔记本< /a>,我们将展示什么内置功能使使用JSON简单在砖Lakehouse的规模。下面是一个增量的ETL架构。左边代表连续和预定的摄取,我们将讨论如何做这两种类型的摄取与自动加载程序。JSON文件后摄取到青铜三角洲湖表,我们将讨论的特性,使它容易查询复杂和半结构化数据类型在JSON数据很常见。< /p>
在附带的笔记本中,我们使用销售订单数据来演示如何简单地摄取JSON。嵌套的JSON销售订单数据集得到复杂的很快。< /p>
读数据Lakehouse上升< /a>探索为什么lakehouses未来的数据架构和数据仓库的父亲,Bill Inmon。< /p>
一站式服务的JSON摄入与自动加载程序< /h2>
自动加载程序< /a>Scala提供了Python和接口来摄取新的数据对象存储的文件夹位置(ADLS S3, gc)三角洲湖表。自动加载器可以使摄入的一站式服务通过启用数据摄取到三角洲湖表直接从对象存储在一个连续的或计划。< /p>
之前讨论的一般特性自动加载程序,让我们深入研究特性,使摄入的JSON极其容易。下面是一个例子,如何摄取非常复杂的JSON数据。< /p>
df = spark.readStream。< /span>格式< /span>(< /span>“cloudFiles”< /span>)\< /span>.option (< /span>“cloudFiles.schemaLocation”< /span>schemaLocation) \< /span>.option (< /span>“cloudFiles.format”< /span>,< /span>“json”< /span>)\< /span>.option (< /span>“cloudFiles.inferColumnTypes”< /span>,< /span>“真正的”< /span>)\< /span>.option (< /span>“cloudFiles.schemaEvolutionMode”< /span>,< /span>“addNewColumns”< /span>)\< /span>.option (< /span>“cloudFiles.schemaHints”< /span>schemaHints) \< /span>.load (landingZoneLocation)< /code>
定义模式的灵活性和易用性< /strong>:在上面的代码中,我们使用两个特性的自动加载程序方便地定义模式虽然给护栏有问题的数据。两个有用的特性cloudFiles.inferColumnTypes< /span>和cloudFiles.schemaHints< /span>。让我们仔细看看定义:< /p>
功能1 -使用cloudFiles。在ferColumnTypes for automatically inferring data types during the schema inference process:< /strong>的默认值cloudFiles.inferColumnTypes< /span>是假的,因为在大多数情况下,最好有顶级列字符串模式演化的鲁棒性和避免数值类型不匹配等问题(整数,多头,漂浮)在模式演化过程中。< /p>
功能2 -使用cloudFiles。schemaHints用于指定所需的数据类型来补充模式推理:< /strong>模式使用提示只有在< /strong>你不提供一个模式来自动加载程序。提示是否可以使用模式cloudFiles.inferColumnTypes< /span>启用或禁用。可以找到更多的细节在这里< /a>。< /p>
在此用例中(笔记本< /a>),我们集cloudFiles.inferColumnTypes< /span>真正的因为我们要列和复杂数据类型推断,而不是自动加载程序的默认推断的数据类型的字符串。推断大多数列的忠诚会给这个复杂的JSON并为查询后提供灵活性。此外,在推断列类型十分便利的同时,我们也知道有问题列摄取。这就是cloudFiles.schemaHints< /span>进入游戏,一起工作cloudFiles.inferColumnTypes< /span>。两个选项的组合允许推断大多数列的复杂数据类型,指定所需的数据类型(字符串在这个例子)只有两个< /strong>的列。< /p>
让我们仔细看看这两个问题列。从半结构化的JSON数据,我们使用的笔记本< /a>问题,我们已经确定了两列数据:“ordered_products.element。promotion_info”和“clicked_items”。因此,我们暗示他们应该进来作为字符串(参见上面的数据片段的列:“ordered_products.element.promotion_info”)。对于这些列,我们可以很容易地查询SQL的半结构化JSON,稍后我们将讨论。你可以看到一个提示是一个嵌套列在一个数组,这使得这个功能真的功能复杂的模式!< /p>
功能3 -使用模式演化< /a>处理模式变化随着时间的推移使摄取和数据更有弹性:< /strong>像模式推理,模式演化是简单的实现自动加载程序。你所要做的cloudFiles.schemaLocation< /span>,保存位置在对象存储的模式,然后随着时间的推移可以适应模式演化。澄清,模式演化是当摄入数据变化的模式和模式三角洲湖表的相应变化。< /p>
例如,在附带的笔记本< /a>,一个额外的列命名fulfillment_days< /span>添加到数据摄取自动加载程序。这个专栏是被自动加载器和自动适用于三角洲湖表。根据文档< /a>,你可以改变你喜欢的模式演化模式。这是一个快速概述汽车加载程序支持的模式的选择cloudFiles.schemaEvolutionMode< /span>:< /p>
- addNewColumns< /span>:模式时的默认模式是不提供自动加载程序。新列添加到模式。现有的列不进化数据类型。< /li>
- failOnNewColumns< /span>:如果自动加载程序检测到一个新列,流将会失败。它不会重启,除非提供模式更新或删除出错的数据文件。< /li>
- 救援< /span>:流与第一个推断或提供模式运行。任何数据类型的变化或新列会自动保存在获救的数据列_rescued_data< /span>在你流的模式。在这种模式下,由于模式变化你流不会失败。< /li>
- 没有一个< /span>:模式时的默认模式是提供给汽车加载程序。它不发展模式。新列被忽略和数据并不获救,除非获救的数据列分别作为一个选项提供。< /li>
上面的例子(也在笔记本< /a>)不包括一个模式,因此我们使用默认选项.option (“cloudFiles。schemaEvolutionMode”、“addNewColumns”)< /span>在readStream< /span>适应模式演化。< /p>
功能4 -使用获救的数据列< /a>捕获错误的数据在一个额外的列,所以没有丢失:< /strong>获救的数据列,所有未解析数据保存、ETL过程中确保你永远不会丢失数据。如果数据不符合当前的模式,无法进入其所需的列,获救的数据不会丢失数据列。在此用例中(笔记本< /a>),我们没有使用这个选项。打开这个选项,您可以指定如下:.option (“cloudFiles。schemaEvolutionMode”、“救援”)。< /span>请参阅更多的信息在这里< /a>。< /p>
现在我们已经探讨了自动加载器特性,使它的JSON数据和解决挑战< /a>一开始提到的,让我们来看看一些特性,让所有的摄取:一站式服务< /p>
df。writeStream \.format \(“δ”)。< /span>触发< /span>(一次< /span>=< /span>真正的< /span>)\< /span>.option (“mergeSchema”,“真正的”)\.option (“checkpointLocation”, bronzeCheckPointLocation) \。< /span>开始< /span>(bronzeTableLocation)< /span>
5 -使用触发一次< /a>和触发AvailableNow< /a>连续与预定的摄取:< /strong>而自动加载器是一个Apache火花™结构化流源,它不需要连续运行。您可以使用触发一次< /a>可以把它变成一个计划时,它的工作,关闭所有文件已经摄入。这方便当你没有需要连续不断的摄取。然而,它还使您能够随时间下降的节奏安排,最终去不断摄取不改变运行代码。在DBR 10.1和以后,我们已经介绍了Trigger.AvailableNow< /a>提供相同的数据处理语义触发一次,但也可以执行速度限制,以确保您的数据处理可以扩展到大量数据。< /p>
6 -使用检查点< /a>处理状态:< /strong>状态是启动所需的信息的摄入过程如果这个过程停止。例如,使用自动加载程序,国家将包括的文件集已经摄入。检查点< /a>保存状态如果ETL停止在任何时候,无论是故意还是由于失败。通过利用检查点,自动加载程序持续运行,也可以是周期性或计划工作的一部分。在上面的示例中,保存在检查站的选择checkpointLocation< /span>。如果终止自动加载程序,然后重新启动,它将使用检查点恢复其最新状态,不会再加工文件已经处理。< /p>
查询半结构化和复杂的结构化数据< /h2>
现在我们有我们的JSON数据三角洲湖表,让我们探索的方法可以查询半结构化和复杂的结构化数据。让我们解决半结构化数据的查询最后的挑战。< /p>
直到这一点上,我们使用自动加载程序编写一个三角洲表到一个特定的位置。位置我们可以访问这个表的SQL,但是对于可读性,我们点一个外部表位置使用以下SQL代码。< /p>
创建< /span>表< /span>autoloaderBronzeTable< /span>位置< /span>“$ {c.bronzeTablePath}”< /span>;< /span>
轻松访问顶级和嵌套数据的半结构化JSON列使用语法铸造值:< /strong>
选择< /span>fulfillment_days fulfillment_days:采摘,< /span>fulfillment_days:包装::< /span>双< /span>fulfillment_days: shipping.days< /span>从< /span>autoloaderBronzeTable< /span>在哪里< /span>fulfillment_days< /span>是< /span>不< /span>零< /span>
当摄入数据时,您可能需要保持在一个JSON字符串,和一些数据可能不是正确的数据类型。在这些情况下,语法在上面的例子中使半结构化数据的查询部分简单,易于阅读。双击这个例子,让我们看看列中的数据filfillment_days< /span>,这是一个JSON字符串列:< /p>
功能7 -< /strong>使用一个冒号(:)提取高层< /a>的一个JSON字符串列:例如,filfillment_days:选< /span>返回值为0.32上面的第一行。< /p>
8 -使用< /strong>点符号< /a>访问嵌套的领域:例如,fulfillment_days: shipping.days< /span>返回值为3.7上面的第一行。< /p>
功能9 -< /strong>使用双冒号(::)换取指定所需的数据类型铸造价值< /a>:
例如,fulfillment_days:包装::翻倍< /span>返回两个数据类型的值的字符串值1.99包装上面的第一行。< /p>
从半结构化数组中提取值即使不规范的数据:< /strong>
SELECT *,减少(all_click_count_array< /span>0< /span>(acc) - > acc +值)< /span>作为< /span>总和从< /span>(< /span>选择order_number clicked_items: [*] [< /span>1< /span>]< /span>作为< /span>all_click_counts,< /span>from_json (clicked_items: [*] [< /span>1< /span>),< /span>“数组<字符串>”< /span>)::数组<< /span>int< /span>>< /span>作为< /span>all_click_count_array< /span>从< /span>autoloaderBronzeTable< /span>)< /< /span>int< /span>> < /< /span>字符串< /span>>< /span>
不幸的是,并不是所有的数据都是对我们有用的结构。例如,列clicked_items< /span>是一个令人迷惑的数组的数组数作为字符串。下面是一个片段中数据的列clicked_items< /span>:< /p>
功能10 -从数组中提取值< /a>:< /strong>使用星号(*)来提取JSON数组中所有值的字符串。数组的具体指标,使用一个基于0的值。例如,SQLclicked_items: [*] [1]< /span>返回的字符串值(“54”、“85”)。< /p>
铸造复杂的数组值< /strong>:在提取正确的值数组的数组,我们可以使用from_json< /span>和::数组 将数组转换为一种格式,可以总结减少< /span>。最后,返回第一行的总结价值139 (54 + 89)。这是件很有趣的事情,我们是多么容易就可以从不合语法的JSON在SQL和值!< /p>
聚合在SQL和复杂的结构化数据:< /strong>
访问复杂的结构化数据,以及结构化和半结构化数据之间移动,一直在砖可用于很长一段时间。< /p>
选择< /span>order_date, ordered_products_explode.name< /span>作为< /span>product_name,< /span>总和< /span>(ordered_products_explode.qty)< /span>作为< /span>数量< /span>从< /span>(< /span>选择< /span>日期< /span>(from_unixtime (order_datetime))< /span>作为< /span>order_date,< /span>爆炸(ordered_products)< /span>作为< /span>ordered_products_explode< /span>从< /span>autoloaderBronzeTable< /span>在哪里< /span>日期< /span>(from_unixtime (order_datetime))< /span>是< /span>不< /span>零< /span>)集团< /span>通过< /span>order_date, ordered_products_explode.name< /span>订单< /span>通过< /span>order_date, ordered_products_explode.name< /span>
在上面的SQL查询中,我们探讨了如何访问和聚合数据复杂的结构化数据的列ordered_products< /span>。显示数据的复杂性,下面是一行的列的一个例子ordered_products< /span>这里,我们的目标是找到每个产品的数量每天出售。正如你所看到的,产品和数量都是嵌套的数组中。< /p>
访问数组元素的行< /strong>:使用爆炸ordered_products列,这样每个元素是它自己的行,如所示。< /p>
访问嵌套域< /strong>:使用点符号来访问嵌套字段以同样的方式作为半结构化JSON。例如,ordered_products_explode。数量返回第一行的值为1。我们可以组和按日期和数量和产品名称。< /p>
额外的资源< /strong>:我们已经介绍了很多主题查询结构化和半结构化的JSON数据,但是你可以在这里找到更多的信息:< /p>
结论< /h2>
在砖,我们努力把不可能变为可能,硬容易。自动加载程序使摄取大规模复杂的JSON使用情况下简单的和可能的。半结构化的SQL语法和复杂的数据简化操作数据。让我们回顾10特点:< /p>
- 功能1 -推断列类型< /a>在模式推理推断数据类型< /li>
- 功能2 -模式提示< /a>用于指定所需的数据类型来补充模式推理< /li>
- 功能3 -模式演化< /a>处理模式在摄入数据随时间的变化< /li>
- 特征4 -获救的数据列< /a>捕捉错误的数据在一个额外的列,所以没有丢失< /li>
- 特征5 -触发一次< /a>和触发AvailableNow< /a>持续和定期摄取大量数据< /li>
- 功能6 -检查点< /a>来处理摄入过程的状态< /li>
- 功能7 -提取JSON列< /a>用于访问顶级列在JSON文件中< /li>
- 功能8 -点符号< /a>用于访问嵌套的字段< /li>
- 功能9 -铸造价值< /a>将值转换为指定的数据类型< /li>
- 功能10 -从数组中提取值< /a>用于访问数组和结构体数组< /li>
现在你知道如何摄取和自动加载器和SQL查询复杂JSON,我们等不及要看你建立。< /p>
免费试着砖< /div>
相关的帖子< /h2>
麻烦免费数据摄入发现砖简化了半结构化数据摄入湖成三角洲与详细的用例,演示,现场问答……< /div>
看到所有工程的博客的帖子< /a>
2021年11月11日 在工程的博客< /a>
摄入与半结构化数据和查询JSON可以繁琐,耗费时间,但汽车装载机和三角洲湖< /a>使它容易。JSON数据非常灵活,这使得它强大,但也很难摄取和查询。最大的挑战包括:< /p>
在本博客和附带的笔记本< /a>,我们将展示什么内置功能使使用JSON简单在砖Lakehouse的规模。下面是一个增量的ETL架构。左边代表连续和预定的摄取,我们将讨论如何做这两种类型的摄取与自动加载程序。JSON文件后摄取到青铜三角洲湖表,我们将讨论的特性,使它容易查询复杂和半结构化数据类型在JSON数据很常见。< /p>
在附带的笔记本中,我们使用销售订单数据来演示如何简单地摄取JSON。嵌套的JSON销售订单数据集得到复杂的很快。< /p>
读数据Lakehouse上升< /a>探索为什么lakehouses未来的数据架构和数据仓库的父亲,Bill Inmon。< /p>
自动加载程序< /a>Scala提供了Python和接口来摄取新的数据对象存储的文件夹位置(ADLS S3, gc)三角洲湖表。自动加载器可以使摄入的一站式服务通过启用数据摄取到三角洲湖表直接从对象存储在一个连续的或计划。< /p>
之前讨论的一般特性自动加载程序,让我们深入研究特性,使摄入的JSON极其容易。下面是一个例子,如何摄取非常复杂的JSON数据。< /p>
定义模式的灵活性和易用性< /strong>:在上面的代码中,我们使用两个特性的自动加载程序方便地定义模式虽然给护栏有问题的数据。两个有用的特性cloudFiles.inferColumnTypes< /span>和cloudFiles.schemaHints< /span>。让我们仔细看看定义:< /p>
功能1 -使用cloudFiles。在ferColumnTypes for automatically inferring data types during the schema inference process:< /strong>的默认值cloudFiles.inferColumnTypes< /span>是假的,因为在大多数情况下,最好有顶级列字符串模式演化的鲁棒性和避免数值类型不匹配等问题(整数,多头,漂浮)在模式演化过程中。< /p>
功能2 -使用cloudFiles。schemaHints用于指定所需的数据类型来补充模式推理:< /strong>模式使用提示只有在< /strong>你不提供一个模式来自动加载程序。提示是否可以使用模式cloudFiles.inferColumnTypes< /span>启用或禁用。可以找到更多的细节在这里< /a>。< /p>
在此用例中(笔记本< /a>),我们集cloudFiles.inferColumnTypes< /span>真正的因为我们要列和复杂数据类型推断,而不是自动加载程序的默认推断的数据类型的字符串。推断大多数列的忠诚会给这个复杂的JSON并为查询后提供灵活性。此外,在推断列类型十分便利的同时,我们也知道有问题列摄取。这就是cloudFiles.schemaHints< /span>进入游戏,一起工作cloudFiles.inferColumnTypes< /span>。两个选项的组合允许推断大多数列的复杂数据类型,指定所需的数据类型(字符串在这个例子)只有两个< /strong>的列。< /p>
让我们仔细看看这两个问题列。从半结构化的JSON数据,我们使用的笔记本< /a>问题,我们已经确定了两列数据:“ordered_products.element。promotion_info”和“clicked_items”。因此,我们暗示他们应该进来作为字符串(参见上面的数据片段的列:“ordered_products.element.promotion_info”)。对于这些列,我们可以很容易地查询SQL的半结构化JSON,稍后我们将讨论。你可以看到一个提示是一个嵌套列在一个数组,这使得这个功能真的功能复杂的模式!< /p>
功能3 -使用模式演化< /a>处理模式变化随着时间的推移使摄取和数据更有弹性:< /strong>像模式推理,模式演化是简单的实现自动加载程序。你所要做的cloudFiles.schemaLocation< /span>,保存位置在对象存储的模式,然后随着时间的推移可以适应模式演化。澄清,模式演化是当摄入数据变化的模式和模式三角洲湖表的相应变化。< /p>
例如,在附带的笔记本< /a>,一个额外的列命名fulfillment_days< /span>添加到数据摄取自动加载程序。这个专栏是被自动加载器和自动适用于三角洲湖表。根据文档< /a>,你可以改变你喜欢的模式演化模式。这是一个快速概述汽车加载程序支持的模式的选择cloudFiles.schemaEvolutionMode< /span>:< /p>
上面的例子(也在笔记本< /a>)不包括一个模式,因此我们使用默认选项.option (“cloudFiles。schemaEvolutionMode”、“addNewColumns”)< /span>在readStream< /span>适应模式演化。< /p>
功能4 -使用获救的数据列< /a>捕获错误的数据在一个额外的列,所以没有丢失:< /strong>获救的数据列,所有未解析数据保存、ETL过程中确保你永远不会丢失数据。如果数据不符合当前的模式,无法进入其所需的列,获救的数据不会丢失数据列。在此用例中(笔记本< /a>),我们没有使用这个选项。打开这个选项,您可以指定如下:.option (“cloudFiles。schemaEvolutionMode”、“救援”)。< /span>请参阅更多的信息在这里< /a>。< /p>
现在我们已经探讨了自动加载器特性,使它的JSON数据和解决挑战< /a>一开始提到的,让我们来看看一些特性,让所有的摄取:一站式服务< /p>
5 -使用触发一次< /a>和触发AvailableNow< /a>连续与预定的摄取:< /strong>而自动加载器是一个Apache火花™结构化流源,它不需要连续运行。您可以使用触发一次< /a>可以把它变成一个计划时,它的工作,关闭所有文件已经摄入。这方便当你没有需要连续不断的摄取。然而,它还使您能够随时间下降的节奏安排,最终去不断摄取不改变运行代码。在DBR 10.1和以后,我们已经介绍了Trigger.AvailableNow< /a>提供相同的数据处理语义触发一次,但也可以执行速度限制,以确保您的数据处理可以扩展到大量数据。< /p>
6 -使用检查点< /a>处理状态:< /strong>状态是启动所需的信息的摄入过程如果这个过程停止。例如,使用自动加载程序,国家将包括的文件集已经摄入。检查点< /a>保存状态如果ETL停止在任何时候,无论是故意还是由于失败。通过利用检查点,自动加载程序持续运行,也可以是周期性或计划工作的一部分。在上面的示例中,保存在检查站的选择checkpointLocation< /span>。如果终止自动加载程序,然后重新启动,它将使用检查点恢复其最新状态,不会再加工文件已经处理。< /p>
现在我们有我们的JSON数据三角洲湖表,让我们探索的方法可以查询半结构化和复杂的结构化数据。让我们解决半结构化数据的查询最后的挑战。< /p>
直到这一点上,我们使用自动加载程序编写一个三角洲表到一个特定的位置。位置我们可以访问这个表的SQL,但是对于可读性,我们点一个外部表位置使用以下SQL代码。< /p>
轻松访问顶级和嵌套数据的半结构化JSON列使用语法铸造值:< /strong> 当摄入数据时,您可能需要保持在一个JSON字符串,和一些数据可能不是正确的数据类型。在这些情况下,语法在上面的例子中使半结构化数据的查询部分简单,易于阅读。双击这个例子,让我们看看列中的数据filfillment_days< /span>,这是一个JSON字符串列:< /p>
功能7 -< /strong>使用一个冒号(:)提取高层< /a>的一个JSON字符串列:例如,filfillment_days:选< /span>返回值为0.32上面的第一行。< /p>
8 -使用< /strong>点符号< /a>访问嵌套的领域:例如,fulfillment_days: shipping.days< /span>返回值为3.7上面的第一行。< /p>
功能9 -< /strong>使用双冒号(::)换取指定所需的数据类型铸造价值< /a>: 从半结构化数组中提取值即使不规范的数据:< /strong> 不幸的是,并不是所有的数据都是对我们有用的结构。例如,列clicked_items< /span>是一个令人迷惑的数组的数组数作为字符串。下面是一个片段中数据的列clicked_items< /span>:< /p>
功能10 -从数组中提取值< /a>:< /strong>使用星号(*)来提取JSON数组中所有值的字符串。数组的具体指标,使用一个基于0的值。例如,SQLclicked_items: [*] [1]< /span>返回的字符串值(“54”、“85”)。< /p>
铸造复杂的数组值< /strong>:在提取正确的值数组的数组,我们可以使用from_json< /span>和::数组 聚合在SQL和复杂的结构化数据:< /strong> 访问复杂的结构化数据,以及结构化和半结构化数据之间移动,一直在砖可用于很长一段时间。< /p>
在上面的SQL查询中,我们探讨了如何访问和聚合数据复杂的结构化数据的列ordered_products< /span>。显示数据的复杂性,下面是一行的列的一个例子ordered_products< /span>这里,我们的目标是找到每个产品的数量每天出售。正如你所看到的,产品和数量都是嵌套的数组中。< /p>
访问数组元素的行< /strong>:使用爆炸ordered_products列,这样每个元素是它自己的行,如所示。< /p>
访问嵌套域< /strong>:使用点符号来访问嵌套字段以同样的方式作为半结构化JSON。例如,ordered_products_explode。数量返回第一行的值为1。我们可以组和按日期和数量和产品名称。< /p>
额外的资源< /strong>:我们已经介绍了很多主题查询结构化和半结构化的JSON数据,但是你可以在这里找到更多的信息:< /p>
在砖,我们努力把不可能变为可能,硬容易。自动加载程序使摄取大规模复杂的JSON使用情况下简单的和可能的。半结构化的SQL语法和复杂的数据简化操作数据。让我们回顾10特点:< /p>
现在你知道如何摄取和自动加载器和SQL查询复杂JSON,我们等不及要看你建立。< /p>
一站式服务的JSON摄入与自动加载程序< /h2>
df = spark.readStream。< /span>格式< /span>(< /span>“cloudFiles”< /span>)\< /span>.option (< /span>“cloudFiles.schemaLocation”< /span>schemaLocation) \< /span>.option (< /span>“cloudFiles.format”< /span>,< /span>“json”< /span>)\< /span>.option (< /span>“cloudFiles.inferColumnTypes”< /span>,< /span>“真正的”< /span>)\< /span>.option (< /span>“cloudFiles.schemaEvolutionMode”< /span>,< /span>“addNewColumns”< /span>)\< /span>.option (< /span>“cloudFiles.schemaHints”< /span>schemaHints) \< /span>.load (landingZoneLocation)< /code>
df。writeStream \.format \(“δ”)。< /span>触发< /span>(一次< /span>=< /span>真正的< /span>)\< /span>.option (“mergeSchema”,“真正的”)\.option (“checkpointLocation”, bronzeCheckPointLocation) \。< /span>开始< /span>(bronzeTableLocation)< /span>
查询半结构化和复杂的结构化数据< /h2>
创建< /span>表< /span>autoloaderBronzeTable< /span>位置< /span>“$ {c.bronzeTablePath}”< /span>;< /span>
选择< /span>fulfillment_days fulfillment_days:采摘,< /span>fulfillment_days:包装::< /span>双< /span>fulfillment_days: shipping.days< /span>从< /span>autoloaderBronzeTable< /span>在哪里< /span>fulfillment_days< /span>是< /span>不< /span>零< /span>
例如,fulfillment_days:包装::翻倍< /span>返回两个数据类型的值的字符串值1.99包装上面的第一行。< /p>
SELECT *,减少(all_click_count_array< /span>0< /span>(acc) - > acc +值)< /span>作为< /span>总和从< /span>(< /span>选择order_number clicked_items: [*] [< /span>1< /span>]< /span>作为< /span>all_click_counts,< /span>from_json (clicked_items: [*] [< /span>1< /span>),< /span>“数组<字符串>”< /span>)::数组<< /span>int< /span>>< /span>作为< /span>all_click_count_array< /span>从< /span>autoloaderBronzeTable< /span>)< /< /span>int< /span>> < /< /span>字符串< /span>>< /span>
选择< /span>order_date, ordered_products_explode.name< /span>作为< /span>product_name,< /span>总和< /span>(ordered_products_explode.qty)< /span>作为< /span>数量< /span>从< /span>(< /span>选择< /span>日期< /span>(from_unixtime (order_datetime))< /span>作为< /span>order_date,< /span>爆炸(ordered_products)< /span>作为< /span>ordered_products_explode< /span>从< /span>autoloaderBronzeTable< /span>在哪里< /span>日期< /span>(from_unixtime (order_datetime))< /span>是< /span>不< /span>零< /span>)集团< /span>通过< /span>order_date, ordered_products_explode.name< /span>订单< /span>通过< /span>order_date, ordered_products_explode.name< /span>
结论< /h2>