![b0c28f96ee22cac83c60d4a0d846813f.png](https://i-blog.csdnimg.cn/blog_migrate/f6430e9412a0b2125c31496c2e8e640a.png)
#清单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格式代码
- 接入是大数据管道的关键部分。
- 在接入文件时,可以使用正则表达式(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的好。