mysql parquet_Spark与Apache Parquet

七十年代时,有一长辈连练铁砂掌,功夫成了之后,可以掌断五砖,凌空碎砖,威风得不得了。时至八十年代,只能掌断三砖。到九十年代只能一砖一砖的断了。他说,一直以为功力退步了,后来才知道烧砖的配方改了。

2ab31051fc51

数据压缩

前言

前两篇将了spark的部署和一些简单的实例Spark初体验(步骤超详细)和Spark再体验之springboot整合spark。我相信前两篇会对刚入门的sparker来说会有一些启发。

今天在使用spark去加载200万条数据的时候,服务器提示内存分配不足(服务器配置较低),这里我就在想有没有什么方法将数据压缩压缩再压缩呢?网上查资料,问他人,最后看到并使用了Apache Parquet官网,这里简单的介绍一下parquet

Parquet

Parquet是面向分析型业务的列式存储格式,由Twitter和Cloudera合作开发,2015年5月从Apache的孵化器里毕业成为Apache顶级项目.

当时Twitter的日增数据量达到压缩之后的100TB+,存储在HDFS上,工程师会使用多种计算框架(例如MapReduce, Hive, Pig等)对这些数据做分析和挖掘;日志结构是复杂的嵌套数据类型,例如一个典型的日志的schema有87列,嵌套了7层。所以需要设计一种列式存储格式,既能支持关系型数据(简单数据类型),又能支持复杂的嵌套类型的数据,同时能够适配多种数据处理框架。

通过阅读这篇文章,相信你会对parquet的优点有所了解。

网上关于它的介绍和算法的讲解一大推,简单的讲使用parquet存储数据有以下优点:

压缩数据

不失真

减少IO吞吐量

高效的查询

更重要的是spark和parquet简直是绝配,犹如小葱拌豆腐、京酱肉丝陪面皮、手擀面配大蒜。。。

示例

老规矩,先上pom

...

1.7.0

...

org.apache.parquet

parquet-common

${parquet.version}

org.apache.parquet

parquet-encoding

${parquet.version}

org.apache.parquet

parquet-column

${parquet.version}

org.apache.parquet

parquet-hadoop

${parquet.version}

下面使用spark对mysql的一张表做parquet的读写操作

将整张表的数据存储为parquet格式的文件

static String url = "jdbc:mysql://localhost:3306/world?" +

"useUnicode=true&characterEncoding=UTF-8" +

"&zeroDateTimeBehavior=convertToNull";

static String table = "jd_trainingdata";

static String username = "root";

static String passwd = "root";

private static void parquetWrite() {

SparkConf conf = new SparkConf()

.setAppName("test")

.setMaster("local")

.set("spark.executor.memory", "8g")

.set("spark.rdd.compress true","true")

.set("spark.testing.memory", "2147480000");

JavaSparkContext sc = new JavaSparkContext(conf);

SQLContext sqlContext = new SQLContext(sc);

sqlContext.setConf("spark.sql.dialect", "sql");

Properties connectionProperties = new Properties();

connectionProperties.put("driver","com.mysql.jdbc.Driver");

connectionProperties.put("user", username);

connectionProperties.put("password", passwd);

DataFrame vectorTable = sqlContext.read().jdbc(url, table,connectionProperties);

vectorTable.saveAsParquetFile("jdData");// 在项目里生成文件,当然你也可以写绝对路径

}

结果为

2ab31051fc51

parquet包含的文件

关于内容我没有去深究(官网有详细的解释说明),但是能看得出文件是成功的生成了~

那么接下来看看如何去读parquet的文件内容

private static void parquetRead() {

SparkConf conf = new SparkConf()

.setAppName("test")

.setMaster("local[4]")

.set("spark.executor.memory", "8g")

.set("spark.rdd.compress true","true")

.set("spark.testing.memory", "2147480000");

JavaSparkContext sc = new JavaSparkContext(conf);

SQLContext sqlContext = new SQLContext(sc);

sqlContext.parquetFile("jdData").registerTempTable("jdData");

DataFrame dbaClos = sqlContext.sql("select * from jdData where Title = 'DBA' and Title <> '' ");

dbaClos.show();

}

运行日志

2ab31051fc51

日志

当你拿到sqlContext的时候,你就可以使用spark提供的sql去查找你想要的数据,要提醒一下, spark支持的sql跟mysql,oracle的不太一样,详细参考官网帮助文档

后续

这里说一下我为什么使用parquet,我现在测试服务器的内存是16g,项目在启动的时候需要加载其他的模型、数据等文件,而且数据虽然才有220多万条,但是存储的内容比较多,所以就会导致内存不足,使用了parquet之后,数据大小直接被压缩为原来的三分之一!!!而且spark对parquet文件的支持近乎完美,所以使用parquet之后,我完全可以不用考虑内存分配不足的问题了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spark SQL可以通过DataFrame API或SQL语句来操作外部数据源,包括parquet、hive和mysql等。其中,parquet是一种列式存储格式,可以高效地存储和查询大规模数据;hive是一种基于Hadoop的数据仓库,可以通过Spark SQL来查询和分析;而mysql是一种常见的关系型数据库,可以通过Spark SQL来读取和写入数据。在使用Spark SQL操作外部数据源时,需要先创建DataFrame或注册表,然后通过API或SQL语句来进行数据的读取、过滤、聚合等操作。同时,还可以通过Spark SQL的连接器来实现不同数据源之间的数据传输和转换。 ### 回答2: Spark SQL 是 Apache Spark 中的一个模块,用于在大规模数据集上进行结构化数据处理。它支持多种数据源,并提供了访问、查询和操作这些数据源的功能。 对于外部数据源的操作,Spark SQL 提供了适配器和驱动程序来连接不同的数据源。下面简单介绍一下对于三种常见的数据源(Parquet、Hive、MySQL)的操作方式: 1. ParquetParquet 是一种列式存储格式,适用于大规模数据存储和分析。对于 Parquet 数据源,Spark SQL 提供了原生的支持,你可以直接使用 `spark.read.parquet()` 方法读取 Parquet 文件,并通过 `write.parquet()` 方法写入 Parquet 文件。Spark SQL 会自动推断 Parquet 文件的模式(schema),你也可以通过指定模式参数来指定具体的模式。 2. Hive:Hive 是一个数据仓库基础设施,可以在 Hadoop 上进行数据仓库的处理和查询。Spark SQL 可以与 Hive 结合使用,使用 Hive 提供的 metastore 来管理表和模式,通过 HiveQL(Hive 查询语言)来查询和操作 Hive 数据。你可以通过 `spark.sql()` 方法来执行 HiveQL 查询,也可以使用 `registerTempTable()` 方法将一个 Spark DataFrame 注册为一个临时表,然后通过 SQL 语句查询这个临时表。 3. MySQLMySQL 是一种关系型数据库管理系统,Spark SQL 也可以与 MySQL 进行集成。首先,需要在 Spark 中导入相应的 MySQL 驱动程序,例如 "com.mysql.jdbc.Driver"。然后,通过 `spark.read.format("jdbc")` 方法来读取 MySQL 数据库中的表,你需要指定连接 URL、表名、用户名和密码等参数。使用相同的方式,你也可以将 Spark DataFrame 写入到 MySQL 数据库中。 总结起来,Spark SQL 对于 Parquet、Hive 和 MySQL 这些外部数据源都提供了直接的支持和集成。通过适配器和驱动程序,你可以使用 Spark SQL 的 API 和功能来读取、写入、查询和操作这些外部数据源中的数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值