sparkSql动态插入hive分区表

前提条件:hive中创建分区表,并指定分区键
create table test(
id stirng
)partitioned by (name string)
stored as orc;

创建sparksession,不需要认证的话去掉config中内容

        SparkSession ss =  SparkSession.builder()
                .appName("test ")
                .master("local[2]"
                .enableHiveSupport() 
                .config("spark.sql.authorization.enabled", true)  
                .config("hive.security.authorization.enabled", true)
                .getOrCreate();

读取oracle中数据

 String sql = "(select xxx.*, 'a' as name from xxx where time >= trunc(sysdate)  ) a";
 Dataset table = ss.read()
            .format("jdbc")
            .option("driver", "oracle.jdbc.OracleDriver")
            .option("url", "jdbc:oracle:thin:@1.1.1.1:1521:orcl")
            .option("user", "xx")
            .option("password", "xx")
            .option("dbtable", sql)
            .option("fetchsize", 100000)
            .option("numPartitons", 10)
            .load();

动态插入hive分区
1.配置文件设置或者 ss.sql(set hive.exec.dynamic.partition =true);
hive.exec.dynamic.partition =true #开启动态分区
hive.exec.dynamic.partition.mode=nonstrict # 值为strict 时会提示要求至少包含一个静态分区列

        df.coalesce(100)
                .write()
                .format("orc")
                .mode(SaveMode.Overwrite)
                .insertInto("test");

在hdfs上将数据重分布的情况
若需要将数据重新分布可以用coalesce(int numPartitions)或者repartition(int numPartitions),repartition方法和coalesce都调用org.apache.spark.sql.catalyst.plans.logical.Repartition方法,只不过参数repartition方法的shuffle=true,此处是将数据以随机key值hash到numPartitions个分区上

假设RDD有N个分区,需要重新划分成M个分区
1)如果N>M并且N和M相差不多,(假如N是1000,M是100)那么就可以将N个分区中的若干个分区合并成一个新的分区,最终合并为M个分区,这时可以不将shuff设置为false,不进行shuffle过程,父RDD和子RDD之间是窄依赖关系。

2)如果N>M并且N远大于M,比如合并成一个分区,父子RDD是窄依赖关系,他们同处在一个Stage中,就可能造成spark程序的并行度不够,从而影响性能,可以把shuffle设置为true(使用repartition),增加并行度。

3)、N

总之:coalesce 适用于n>m 并且n和m相差不大的情况,repartition适用于n远大于m或者n 结果:
查看hdfs上数据,(我在此处插入了2次)
test目录下

FileStatus{path=hdfs://hacluster/user/hive/warehouse/test/name=a;
name=a
FileStatus{path=hdfs://hacluster/user/hive/warehouse/test/name=b;
name=b

name=a 目录下文件

FileStatus{path=hdfs://hacluster/user/hive/warehouse/test/name=a/part-00000;...
part-00000

name=b 目录下文件

FileStatus{path=hdfs://hacluster/user/hive/warehouse/test/name=b/part-00000;...
part-00000

你可能感兴趣的:(hive)