spark可以直接通过各种驱动连接其他数据库,然后将表导入spark中
1.驱动
将驱动放到你的spark目录下:/spark/jars
,然后重启spark
2. 先复制到一个临时表
CREATE table tmptable
USING org.apache.spark.sql.jdbc
OPTIONS (
url 'jdbc:informix-sqli://192.111.22.33:4567/DATACENTER:INFORMIXSERVER=server',
driver 'com.informix.jdbc.IfxDriver',
dbtable 'DATACENTER.table_that_i_want',
user 'informix',
password 'informix',
fetchsize '5000000'
);
CREATE table tmptable
USING org.apache.spark.sql.jdbc
OPTIONS (
url 'jdbc:dm://192.111.22.33:4567/DATACENTER',
driver 'dm.jdbc.driver.DmDriver',
dbtable 'DATACENTER.table_that_i_want',
user 'dm',
password 'dm',
fetchsize '5000000'
);
给了两种driver的例子。临时表是tmptable,然后利用各种你想连接不同类型数据库的driver(放到/spark/jars里且重启了),就可以将原来库里的表复制过来(我用临时表是因为还要分区,如果一条sql就执行完毕的话请大神留言告诉窝(o^^o)
3. 将临时表的数据分区插入到我们的目标表中
CREATE TABLE our_new_table partitioned by (date_partition) stored AS ORC AS SELECT *, date_format(create_time,'y-MM-dd') as date_partition FROM tmptable ;
4.然后就okurrrrrr了
5.其他
- 分区建表的时候partition字段不用真实存在,但是分桶的时候就必须在了
- 一开始写成了 CREATE TABLE our_new_table partitioned by (date_partition string) ,然后说在create的时候是不用指定类型的
- select date_format(date,type) 就可以直接抽取出对应的时间。 比如 select date_format(‘2021-01-01’,‘y-MM-dd’) 就会抽出 ‘2021-01-01’,而select date_format(‘2021-01-01’,‘y’) 就会抽出2021。very好用