产品化的spark如何快速的把一张表数据导入到另一张表

7 篇文章 0 订阅

背景:

现在市面上有很多厂商将spark以及hadoop的生态组件产品化,在ui界面上拖拽来的组件里编写spark sql,或者写spark代码(java,scala,python),类似于传统的数据集成工具datastage,informatica,kettle,将各个组件连接起来组成工作流定时调度,像这样的产品比如联想LeapHD,数梦DTSphere Studio等等,这样的好处是降低大数据开发门槛,新人可以快速的上手工作,数据运维难度大大降低。但是带来的坏处是使用不灵活,下面讲一下在这样的产品中如何将数据快速的从一张表导入到另一张表。

产品界面上不支持只能写spark sql,不能写hql,所以不支持dfs命令,使用HiveContext来解决这个问题

代码:

import org.apache.spark.SparkConf;
import org.apache.spark.SparkContext;
import org.apache.spark.sql.hive.HiveContext;

public class CopyData {
    public static void main(String[] args) {
        SparkConf sparkConf=new SparkConf().setAppName("JavaSpark");
        SparkContext sc=new SparkContext(sparkConf);
        HiveContext hiveContext=new HiveContext(sc);

        String HdfsPath="hdfs:///user/hive/warehouse/";
        String OriginSchema=args[0].toLowerCase()+".db";   //参数一:源表所在库名
        String OriginTable=args[1].toLowerCase();          //参数二:源表所在表名
        String NowSchema=args[2].toLowerCase()+".db";      //参数三:目标表库名
        String NowTable=args[3].toLowerCase();             //参数四:目标表表名
        String OriginaUrl=HdfsPath+OriginSchema+"/"+OriginTable+"/*";
        String NowUrl=HdfsPath+NowSchema+"/"+NowTable;

        hiveContext.sql("set hive.security.authorization.enabled=false");
        hiveContext.sql("set role admin");
        hiveContext.sql("dfs -cp "+OriginaUrl+" "+NowUrl);

        sc.stop();
    }
}

优点:

为什么不适用insert导入数据,我观察了一下,对于大表,9亿条数据,使用insert消耗16-20min,使用上述代码只要7分钟,并且insert时消耗的大量的资源,对于只有3台计算存储节点,节点配置不高的小集群,资源全被这一个任务消耗了,很多任务都在排队等待,而使用dfs -cp,yarn上面只消耗了7g内存。

拓展:

如果要筛选数据插入到另一张表,原表可以做成分区表,导入数据时可以直接把分区下的文件复制到目的表对应的分区下。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值