spark 读取parquet

列式存储布局(比如 Parquet)可以加速查询,因为它只检查所有需要的列并对它们的值执行计算,因此只读取一个数据文件或表的小部分数据。Parquet 还支持灵活的压缩选项,因此可以显著减少磁盘上的存储。

如果您在 HDFS 上拥有基于文本的数据文件或表,而且正在使用 Spark SQL 对它们执行查询,那么强烈推荐将文本数据文件转换为 Parquet 数据文件,以实现性能和存储收益。当然,转换需要时间,但查询性能的提升在某些情况下可能达到 30 倍或更高,存储的节省可高达 75%!

val userDF = spark.read.parquet("file:///usr/local/Cellar/spark-2.3.0/examples/src/main/resources/users.parquet")

可以直接read一个parquet文件,就转成了dataframe。因为parquet文件里有比较丰富的信息,不像普通的文件。所以推荐是把其他文件的格式,清洗后转换成parquet数据格式。

1.把dataframe 转成 parquet 文件

val jsonPeopleDF = spark.read.json("/usr/local/Cellar/spark-2.3.0/examples/src/main/resources/people.json")
 jsonPeopleDF.write.parquet("/Users/walle/Documents/D3/d1.parquet")
val d1DF = spark.read.parquet("file:///Users/walle/Documents/D3/d1.parquet")
d1DF.show

http://www.waitingfy.com/archives/4334

好的,以下是Spark读取Parquet并合并schema的源码,带注释: ```scala // 首先创建一个SparkSession对象 val spark = SparkSession.builder() .appName("MergeParquetSchema") .master("local[*]") .getOrCreate() // 设置合并schema的函数 def mergeSchemas(schemaList: Seq[StructType]): StructType = { // 首先获取所有字段名 val allFields = schemaList.flatMap(_.fields) .map(field => (field.name.toLowerCase, field)).toMap // 再根据字段名进行分组 val groupedFields = allFields.groupBy(_._1).mapValues(_.values.toList) // 对每个字段进行合并,并返回新的StructType StructType(groupedFields.mapValues { fields => // 判断是否有重复的字段名 if (fields.length == 1) { fields.head.dataType } else { // 如果有重复的字段名,则进行类型合并 val fieldTypes = fields.map(_.dataType).distinct if (fieldTypes.length == 1) { // 如果类型相同,则返回该类型 fieldTypes.head } else { // 否则返回String类型 StringType } } }.values.toList) } // 读取Parquet文件,并合并schema val df = spark.read .option("mergeSchema", "true") // 开启合并schema选项 .parquet("path/to/parquet/files") .select("*") // 选择所有列 // 输出schema df.printSchema() // 关闭SparkSession spark.stop() ``` 在上面的代码中,我们首先创建了一个`SparkSession`对象,然后定义了一个`mergeSchemas`函数,用于合并多个`StructType`类型的schema。在该函数中,我们首先获取所有字段名,并将它们按照字段名进行分组,然后对每个分组中的字段进行合并,最终返回一个新的`StructType`类型的schema。 接下来,我们使用`SparkSession`对象的`read`方法读取Parquet文件,并开启合并schema选项,然后使用`select("*")`方法选择所有列。最后,我们输出了数据集的schema,并关闭了`SparkSession`对象。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瓦力冫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值