llvm编译器实战教程第二版_Spark实战第二版(涵盖Spark3.0)第七章 从文件接入数据(完结)...

关注公众号: 登峰大数据 ,阅读Spark实战第二版(完整中文版),系统学习Spark3.0大数据框架! 如果您觉得作者翻译的内容有帮助,请分享给更多人。您的分享,是作者翻译的动力! b0c28f96ee22cac83c60d4a0d846813f.png 7.9 接入Avro, ORC和Parquet文件 在最后一节中,我将向您展示如何接入Avro、ORC和Parquet文件。在本章的前面,了解了传统数据格式,包括CSV、JSON、XML和文本文件。您可能还记得,这些文件格式的构造是类似的。正如预期的那样,大数据文件格式的接入过程是类似的。 在所有示例中,我使用了来自Apache项目本身的样例数据文件。不幸的是,考虑到我在这本书中使用的所有其他数据集,它们并没有像你所期望的那样对创造性分析起到鼓舞作用。 7.9.1 接入Avro 要接入Avro文件,您需要向项目中添加一个库,因为Spark本身并不支持Avro。之后,就像任何文件接入一样,接入数据就很简单了。 实验 你要学习的例子是net.jgp.books.spark.ch07 .lab910_avro_ingestion.AvroToDataframeApp。示例文件来自Apache Avro项目本身。 下面的清单显示了这个示例的预期输出。
#清单7.20 AvroToDataframeApp.java的输出+------------+-------------+----+| station    | time        |temp|+------------+-------------+----+|011990-99999|-619524000000| 0  ||011990-99999|-619506000000| 22 ||011990-99999|-619484400000| -11||012650-99999|-655531200000| 111||012650-99999|-655509600000| 78 |+------------+-------------+----+root  |-- station: string (nullable = true)  |-- time: long (nullable = true)  |-- temp: integer (nullable = true) The dataframe has 5 rows.

自从Spark v2.4以来,Avro就是Apache社区的一部分。在此版本之前,它是由Databricks(作为XML数据源)维护的。您仍然需要手动将依赖项添加到您的pom.xml文件中。额外的库可以通过Maven Central获得,你可以在你的pom.xml中添加库定义:

...             2.12         3.0.0 ...                           org.apache.spark           spark-avro_${scala.version }          ${spark.version}        ...      

其解析如下:

      org.apache.spark       spark-avro_2.12       3.0.0   

添加了库之后,就可以编写代码了,如下面的清单所示。

package net.jgp.books.spark.ch07.lab900_avro_ingestion;import org.apache.spark.sql.Dataset;import org.apache.spark.sql.Row;import org.apache.spark.sql.SparkSession;public class AvroToDataframeApp {     public static void main(String[] args ) {      AvroToDataframeApp app = new AvroToDataframeApp();       app .start();    }     private void start() {      SparkSession spark = SparkSession.builder()            .appName( "Avro to Dataframe" )            .master( "local" )            .getOrCreate();      Dataset df = spark .read()            .format( "avro" )            .load( "data/weather.avro" );       df .show(10);       df .printSchema();      System. out .println( "The dataframe has " + df .count()            + " rows." );    } }

要了解更多关于Spark在2.4版本之前对Avro的支持,您可以在https://github.com/databricks/spark-avro参考Databricks GitHub存储库。

7.9.2 接入ORC

接入ORC是一个简单的过程。Spark需要的格式代码是orc。在Spark v2.4之前的Spark版本中,如果尚未使用Apache Hive,还需要通过指定实现来配置会话。

实验

你要学习的例子是net.jgp.books.spark.ch07 .lab920_orc_ingestion.OrcToDataframeApp。示例文件来自Apache ORC项目本身。

下面的清单显示了这个示例的预期输出。

#清单7.22 OrcToDataframeApp.java的输出+-----+-----+-----+-------+-----+-----+-----+-----+-----+|_col0|_col1|_col2| _col3 |_col4|_col5|_col6|_col7|_col8|+-----+-----+-----+-------+-----+-----+-----+-----+-----+| 1   | M   | M   |Primary| 500 | Good| 0   | 0   | 0   || 2   | F   | M   |Primary| 500 | Good| 0   | 0   | 0   |...| 10  | F   | U   |Primary| 500 | Good| 0   | 0   | 0   |+-----+-----+-----+-------+-----+-----+-----+-----+-----+only showing top 10 rowsroot  |-- _col0: integer (nullable = true)  |-- _col1: string (nullable = true)  |-- _col2: string (nullable = true)  |-- _col3: string (nullable = true)  |-- _col4: integer (nullable = true)  |-- _col5: string (nullable = true)  |-- _col6: integer (nullable = true)  |-- _col7: integer (nullable = true)  |-- _col8: integer (nullable = true) The dataframe has 1920800 rows.

下面的清单提供了读取ORC文件的示例代码。

#清单7.23 OrcToDataframeApp.javapackage net.jgp.books.spark.ch07.lab910_orc_ingestion;import org.apache.spark.sql.Dataset;import org.apache.spark.sql.Row;import org.apache.spark.sql.SparkSession;public class OrcToDataframeApp {     public static void main(String[] args ) {      OrcToDataframeApp app = new OrcToDataframeApp();       app .start();    }     private void start() {      SparkSession spark = SparkSession.builder()            .appName( "ORC to Dataframe" )            .config( "spark.sql.orc.impl" , "native" )#使用本地实现来访问ORC文件,而不是使用Hive实现。            .master ("local" )            .getOrCreate();      Dataset df = spark .read()            .format( "orc" )            .load( "data/demo-11-zlib.orc" );       df .show(10);       df .printSchema();      System. out .println( "The dataframe has " + df .count() + " rows." );    } }

实现参数可以是本地值,也可以是hive值。本地实现意味着它使用Spark附带的实现。它是从Spark v2.4开始的默认值。

7.9.3 接入Parquet

在本节中,您将了解Spark如何接入Parquet数据。Spark将很容易地本地接入Parquet文件:不需要额外的库或配置。重要的是要记住,Parquet也是Spark和Delta Lake使用的默认格式(见第17章)。

实验

你要学习的例子是net.jgp.books.spark.ch07 .lab930_parquet_ingestion.ParquetToDataframeApp。示例文件来自Apache Parquet测试项目本身,可从https://github .com/apache/parquet-testing获得。

下面的清单显示了这个示例的预期输出。

#清单7.24 ParquetToDataframeApp.java的输出+---+--------+-----------+------------+-------+----------+---------+...| id|bool_col|tinyint_col|smallint_col|int_col|bigint_col|float_col|...+---+--------+-----------+------------+-------+----------+---------+...| 4 | true   | 0         | 0          | 0     | 0        | 0.0     |...| 5 | false  | 1         | 1          | 1     | 10       | 1.1     |...| 6 | true   | 0         | 0          | 0     | 0        | 0.0     |...| 7 | false  | 1         | 1          | 1     | 10       | 1.1     |...| 2 | true   | 0         | 0          | 0     | 0        | 0.0     |...| 3 | false  | 1         | 1          | 1     | 10       | 1.1     |...| 0 | true   | 0         | 0          | 0     | 0        | 0.0     |...| 1 | false  | 1         | 1          | 1     | 10       | 1.1     |...+---+--------+-----------+------------+-------+----------+---------+...root  |-- id: integer (nullable = true)  |-- bool_col: boolean (nullable = true)  |-- tinyint_col: integer (nullable = true)  |-- smallint_col: integer (nullable = true)  |-- int_col: integer (nullable = true)  |-- bigint_col: long (nullable = true)  |-- float_col: float (nullable = true)  |-- double_col: double (nullable = true)  |-- date_string_col: binary (nullable = true)  |-- string_col: binary (nullable = true)  |-- timestamp_col: timestamp (nullable = true) The dataframe has 8 rows.

下面的清单提供了读取Parquet文件的示例代码。

package net.jgp.books.spark.ch07.lab930_parquet_ingestion;import org.apache.spark.sql.Dataset;import org.apache.spark.sql.Row;import org.apache.spark.sql.SparkSession;public class ParquetToDataframeApp {     public static void main(String[] args ) {      ParquetToDataframeApp app = new ParquetToDataframeApp();       app .start();    }     private void start() {      SparkSession spark = SparkSession. builder ()            .appName( "Parquet to Dataframe" )            .master( "local" )            .getOrCreate();      Dataset df = spark .read()            .format( "parquet" )            .load( "data/alltypes_plain.parquet" );       df .show(10);       df .printSchema();      System. out .println ("The dataframe has " + df .count() + " rows." );    } }

7.9.4 接入Avro, ORC, 或Parquet数据的参考表格

表7.1总结了希望接入的每种文件类型的Spark格式代码。

表7.1各文件格式的Spark格式代码

df7ed5fa01320e5a1c11b68d6a5ad202.png

总结
  • 接入是大数据管道的关键部分。
  • 在接入文件时,可以使用正则表达式(regex)指定路径。
  • CSV比它看起来要复杂得多,但是一组丰富的选项允许您调优解析器。
  • JSON有两种形式:称为JSON行的单行格式和多行JSON格式。Spark采用了这两种JSON格式(自v2.2.0以来)。
  • 本章中描述的所有文件接入选项都不区分大小写。
  • Spark内置接收CSV、JSON和text的功能。
  • 为了接入XML, Spark需要一个Databricks提供的插件。
  • 接收任何文档的模式都非常类似:指定格式并进行读取。
  • 传统的文件格式,包括CSV、JSON和XML,不太适合大数据。
  • JSON和XML不被认为是可分拆的文件格式。
  • Avro、ORC和Parquet是流行的大数据文件格式。它们将数据和模式嵌入到文件中并压缩数据。在处理大数据时,它们比CSV、JSON和XML更容易操作,也更有效。
  • ORC和Parquet文件是列式存储格式。
  • Avro是基于行的,更适合流处理。
  • ORC和Parquet的压缩比Avro的好。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: LLVM编译器实战教程第二版是一本介绍LLVM编译器的实践指南,书中详细介绍了如何使用LLVM编译器来构建高性能的编译器、工具和应用程序。该书主要分为三个部分,分别是LLVM基础知识、编译器中的LLVM和工具中的LLVM。 在LLVM基础知识部分,作者首先介绍了LLVM的概念和架构,并详细讲解了LLVM中的IR表示和优化。然后,作者介绍了如何使用LLVM来构建一个简单的编译器,包括如何实现词法分析、语法分析和代码生成。最后,作者讨论了如何使用LLVM来实现一些高级特性,例如JIT编译和LLVM IR的交互式优化。 在编译器中的LLVM部分,作者分别介绍了如何使用LLVM来开发C、C++和Objective-C编译器。该部分还讲解了如何使用LLVM来实现静态分析、污点分析和动态分析,并提供了一些实际的案例来帮助读者更好地理解。 在工具中的LLVM部分,作者介绍了如何使用LLVM来构建一些实用的工具,例如调试器、反汇编器和符号化工具。该部分还讨论了如何使用LLVM来实现自定义的代码生成器和目标描述文件,以及如何使用LLVM来增强其他编程语言和环境中的编译器。 总之,LLVM编译器实战教程第二版是一本非常实用且系统的指南,它能够帮助读者深入了解LLVM编译器的内部机制和应用方法,并且可以作为开发高性能编译器和工具的参考书籍。 ### 回答2: LLVM编译器实战教程第二版是一本面向开发者的指南,它旨在引导读者了解LLVM编译器的内部运作机制,以及如何为其开发可扩展的前端和后端工具。该教程深入浅出地讲解了LLVM编译器的内部结构,包括词法分析、语法分析和代码生成等内容。同时该书提供了许多有关如何使用LLVM开发编译器的实用示例和应用案例,包括如何构建前端和后端的IR、如何使用全局优化和代码生成等。总之,LLVM编译器实战教程第二版是一本很好的LLVM编译器实践指南,它对于那些想要了解LLVM编译器内部的人、想要使用LLVM开发编译器的人或想要利用LLVM的优化和代码生成技术的人,都是一本非常有价值的参考书籍。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值