SPARK-SQL 读取外部数据源 parquet文件的读写

相关的资源文件地址

链接:https://pan.baidu.com/s/1QGQIrVwg56g9eF16ERSLwQ 
提取码:7v8n

toDF算子
个人感觉就是修改schema中列的名称,顺序要一样,不能多,也不能少

parquet 文件读写示例

import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SaveMode;
import org.apache.spark.sql.SparkSession;
public class test14 {
    public static void main(String[] args) {
        SparkSession spark = SparkSession
                .builder()
                .config("spark.driver.host", "localhost")
                .appName("ParquetFileTest")
                .master("local")
                .getOrCreate();

        spark.sparkContext().setLogLevel("ERROR");

        //1: 将json文件数据转化成parquet文件数据
        Dataset<Row> df = spark.read().json(Utils.BASE_PATH + "/people.json");
        df.show();

        df.write().option("compression", "snappy")
                .mode(SaveMode.Overwrite).parquet(Utils.BASE_PATH + "/parquet");

        //2: 读取parquet文件
        Dataset<Row> parquetDF = spark.read().parquet(Utils.BASE_PATH + "/parquet");
        parquetDF.show();
//        +---+-------+
//        |age|   name|
//        +---+-------+
//        | 29|Michael|
//        | 30|   Andy|
//        | 19| Justin|
//        +---+-------+

        //3: parquet schema merge
        //全局设置spark.sql.parquet.mergeSchema = true
        Dataset<Row> dataset_2 = df.toDF("age", "first_name");
        dataset_2.show(false);
//        +---+-------+
//        |age|   first_name|
//        +---+-------+
//        | 29|Michael|
//        | 30|   Andy|
//        | 19| Justin|
//        +---+-------+

        dataset_2.write().mode(SaveMode.Overwrite).parquet(Utils.BASE_PATH + "/parquet_schema_change");

        //mergeSchema 合并 schema
        //这里读取了多个目录的parquet文件
        Dataset<Row> schemaMergeDF =
                spark.read().option("mergeSchema", "true").parquet(Utils.BASE_PATH + "/parquet",
                        Utils.BASE_PATH + "/parquet_schema_change");
        schemaMergeDF.show();
//        +---+-------+----------+
//        |age|   name|first_name|
//        +---+-------+----------+
//        | 29|   null|   Michael|
//        | 30|   null|      Andy|
//        | 19|   null|    Justin|
//        | 29|Michael|      null|
//        | 30|   Andy|      null|
//        | 19| Justin|      null|
//        +---+-------+----------+

        spark.stop();
    }
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值