datax导入hive动态分区

配置hive支持动态分区
  <property>
    <name>hive.exec.dynamic.partition</name>
    <value>true</value>
    <description>Whether or not to allow dynamic partitions in DML/DDL.</description>
  </property>
  <property>
    <name>hive.exec.max.dynamic.partitions</name>
    <value>10000</value>
    <description>Maximum number of dynamic partitions allowed to be created in total.</description>
  </property>
  <property>
    <name>hive.exec.max.dynamic.partitions.pernode</name>
    <value>10000</value>
    <description>Maximum number of dynamic partitions allowed to be created in each mapper/reducer node.</description>
  </property>
  <property>
    <name>hive.exec.dynamic.partition.mode</name>
    <value>nonstrict</value>
    #开启允许所有分区都是动态的,否则必须要有静态分区才能使用。
    <description>
      In strict mode, the user must specify at least one static partition
      in case the user accidentally overwrites all partitions.
      In nonstrict mode all partitions are allowed to be dynamic.
    </description>
  </property>

ddl语句创建分区表
CREATE TABLE IF NOT EXISTS `test_p` (
  `id` int COMMENT 'date in file', 
  `name` string COMMENT 'appname' )
COMMENT 'cleared log of origin log'
PARTITIONED BY (
  `ct`  string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 
STORED AS ORC
TBLPROPERTIES ('creator'='c-chenjc', 'crate_time'='2018-06-07')
;


CREATE TABLE IF NOT EXISTS `my_test_p` (
  `id` int COMMENT 'date in file', 
  `name` string COMMENT 'appname' ,
  `ct`  string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 
STORED AS ORC
TBLPROPERTIES ('creator'='c-chenjc', 'crate_time'='2018-06-07')
;
准备数据

指定表中行数据信息
ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t’ LINES TERMINATED BY ‘\n’

  • ROW FORMAT
  • TERMINATED BY ‘\t’ 每行数据中字段的分隔符
  • LINES TERMINATED BY ‘\n’ 行的分隔符,不指定的时候默认为‘\n’

所以测试数据格式

123,me1,hangzhou
245,peter,beijing
789,alice,shanghai
201,mark,guangzhou
222,mawww,guangzhou
2222,aliuc,beijing

loadl示例
load data local inpath '/app/bigdata/apache-hive-2.3.7-bin/data/testdatact' into table my_test_p;

(partition(dt='20200717'))有静态分区就要加这个

查看结果
hive> select * from my_test_P;
OK
123	me1	hangzhou
245	peter	beijing
789	alice	shanghai
201	mark	guangzhou
222	mawww	guangzhou
2222	aliuc	beijing
Time taken: 1.837 seconds, Fetched: 6 row(s)
hive> 
Insert示例

insert overwrite table test_p partition(ct) select id ,name,ct from my_test_p;

要点:因为dpartition表中只有两个字段,所以当我们查询了三个字段时(多了city字段),所以系统默认以最后一个字段city为分区名,因为分区表的

分区字段默认也是该表中的字段,且依次排在表中字段的最后面。所以分区需要分区的字段只能放在后面,不能把顺序弄错。如果我们查询了四个字段的话,则会报错,因为该表加上分区字段也才三个。要注意系统是根据查询字段的位置推断分区名的,而不是字段名称

在这里插入图片描述

查看分区
show partitions test_table;

在这里插入图片描述

分区用法

分区字段 其实就是一个虚拟字段

select * from table_name where ct='xxx' ; 

在这里插入图片描述
文件定时导入分区

datax模板配置

此方式会失败

{
        "job": {
                "setting": {
                        "speed": {
                                "channel": 1
                        }
                },
                "content": [{
                        "reader": {
                                "name": "mysqlreader",
                                "parameter": {
                                        "column": ["*"],
                                        "password": "xxx",
                                        "username": "xxxx",
                                        "where": "",
                                        "connection": [{
                                                "jdbcUrl": ["jdbc:mysql://xxxxx:3306/web_magic"],
                                                "table": ["mysql_test_p"]
                                        }]
                                }
                        },
                        "writer": {
                                "name": "hdfswriter",
                                "parameter": {
                                        "column": [{
                                                        "name": "id",
                                                        "type": "int"
                                                },
                                                {
                                                        "name": "name",
                                                        "type": "string"
                                                },
                                                {
                                                        "name": "ct",
                                                        "type": "string"
                                                }

                                        ],
                                        "compress": "",
                                        "defaultFS": "hdfs://master:9000",
                                        "fieldDelimiter": ",",
                                        "fileName": "test_p",
                                        "fileType": "text",
                                        "path": "/user/hive/warehouse/testjar.db/test_p",
                                        "writeMode": "append"
                                }
                        }
                }]
     
单分区模版

必须确定分区

{
        "job": {
                "setting": {
                        "speed": {
                                "channel": 1
                        }
                },
                "content": [{
                        "reader": {
                                "name": "mysqlreader",
                                "parameter": {
                                        "column": ["id","name"],
                                        "password": "xxxxx$xx",
                                        "username": "xxxx",
                                        "where": "",
                                        "connection": [{
                                                "jdbcUrl": ["jdbc:mysql://x x xx:3306/web_magic"],
                                                "table": ["mysql_test_p"]
                                        }]
                                }
                        },
                        "writer": {
                                "name": "hdfswriter",
                                "parameter": {
                                        "column": [{
                                                        "name": "id",
                                                        "type": "int"
                                                },
                                                {
                                                        "name": "name",
                                                        "type": "string"
                                                }

                                        ],
                                        "compress": "",
                                        "defaultFS": "hdfs://xxxxx:xxx",
                                        "fieldDelimiter": ",",
                                        "fileName": "test_p",
                                        "fileType": "text",
                                        "path": "/user/hive/warehouse/testjar.db/test_p/ct=shanghai",
                                        "writeMode": "append"
                                }
                        }
                }]

        }
}


python ../bin/datax.py --jvm="-Xms128M -Xmx128M"  ./mysql2hive2.json 

## --jvm是这是最大最小使用内存

对于hdfswriter功能限制

 功能与限制
(1)、目前HdfsWriter仅支持textfile和orcfile两种格式的文件,且文件内容存放的必须是一张逻辑意义上的二维表;
(2)、由于HDFS是文件系统,不存在schema的概念,因此不支持对部分列写入;
(3)、目前仅支持与以下Hive数据类型: 数值型:TINYINT,SMALLINT,INT,BIGINT,FLOAT,DOUBLE 字符串类型:STRING,VARCHAR,CHAR 布尔类型:BOOLEAN 时间类型:DATE,TIMESTAMP 目前不支持:decimal、binary、arrays、maps、structs、union类型;
(4)、对于Hive分区表目前仅支持一次写入单个分区;
(5)、对于textfile需用户保证写入hdfs文件的分隔符与在Hive上创建表时的分隔符一致,从而实现写入hdfs数据与Hive表字段关联;
(6)、HdfsWriter实现过程是:首先根据用户指定的path,创建一个hdfs文件系统上不存在的临时目录,创建规则:path_随机;然后将读取的文件写入这个临时目录;全部写入后再将这个临时目录下的文件移动到用户指定目录(在创建文件时保证文件名不重复); 最后删除临时目录。如果在中间过程发生网络中断等情况造成无法与hdfs建立连接,需要用户手动删除已经写入的文件和临时目录。
(7)、目前插件中Hive版本为1.1.1,Hadoop版本为2.7.1(Apache[为适配JDK1.7],在Hadoop 2.5.0, Hadoop 2.6.0 和Hive 1.2.0测试环境中写入正常;其它版本需后期进一步测试;
(8)、目前HdfsWriter支持Kerberos认证(注意:如果用户需要进行kerberos认证,那么用户使用的Hadoop集群版本需要和hdfsreader的Hadoop版本保持一致,如果高于hdfsreader的Hadoop版本,不保证kerberos认证有效)

博主公众号
求关注
在这里插入图片描述

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
### 回答1: 在DataX中,可以通过一些配置来实现Hive导入时给文件名添加随机数的操作。具体的做法是,在配置文件中的column中添加一个value为"$[RandomUtils.getRandomNumber()]"的元素,该元素会返回一个随机数。完整的配置示例如下: ```json { "job": { "content": [ { "reader": { /*配置reader的相关参数*/ }, "writer": { /*配置writer的相关参数*/ }, "transformer": { "parameter": { "column": [ { "name": "filename", "type": "string", "value": "$[RandomUtils.getRandomNumber()]" } ] } } } ] } } ``` 在上述配置示例中,我们在"transformer"的"parameter"中添加了一个"name"为"filename"、"type"为"string"、"value"为"$[RandomUtils.getRandomNumber()]"的配置项。这样,在DataX导入Hive时,每次会生成一个随机的文件名并添加到配置中。 需要注意的是,上述示例中的配置只能保证在任务启动时生成一次随机数,如果需要在每次导入时都生成一个随机数,则需要自行进行扩展或修改DataX源码。另外,"RandomUtils"为DataX提供的一个工具类,用于生成随机数。如果没有该类,可以自行编写一个相关的工具类来实现功能。 ### 回答2: datax hive导入时,往往需要指定文件名,并且有时需要在文件名后面添加一些随机数。这样可以避免文件名冲突,保证导入过程中的数据的唯一性和完整性。 在datax中,可以通过配置参数来实现文件名后缀的随机数。具体的步骤如下: 1. 配置dataxhive writer插件,找到文件名相关的配置项。这些配置项包括文件名前缀、文件名后缀等。 2. 使用datax提供的内置函数${timestamp}来生成随机数。这个函数可以获取当前的时间戳,作为后缀的一部分。 3. 将${timestamp}函数的结果与文件名的后缀进行拼接,形成最终的文件名后缀。比如,可以将文件名后缀配置为"_${timestamp}",那么导入过程中生成的文件名就会是原始文件名加上一个随机数的后缀。 4. 根据实际需求,可以进一步调整和修改配置项,比如设置文件名的前缀、文件名的格式等等。 通过以上步骤,我们就可以在datax hive导入过程中使用随机数作为文件名的后缀了。这样可以避免文件名冲突,确保导入的数据的唯一性和完整性。同时,也方便后续的数据处理和管理。 ### 回答3: datax是一种用于将数据从一个数据源导入到另一个数据源的工具,而Hive是一种分布式数据仓库。 要在dataxHive导入过程中添加随机数后缀到文件名中,我们可以采取以下步骤: 1.首先,在datax的配置文件中,找到需要配置Hive导入作业的部分。 2.在该作业的配置中,找到指定导入文件名的参数,通常是`fileName`。 3.将该参数的值修改为需要导入的文件名前缀,后面接上随机数。例如,如果文件名前缀是"file",我们可以添加4位随机数作为后缀,即"file1234"。 4.为了实现生成随机数,我们可以使用编程语言中提供的随机数生成函数。例如,在Java中,可以使用`java.util.Random`类来生成随机数。 5.通过编写一个小段程序来生成随机数后缀,并将其拼接到文件名前缀后面。将这个生成的文件名作为`fileName`参数的值。 6.保存配置文件并启动datax作业。datax将使用生成的带有随机数后缀的文件名作为Hive导入的目标文件名。 以上是通过编程实现的一种方法来实现datax Hive导入时添加随机数后缀到文件名中。根据不同的实际情况,可能需要在具体的datax配置文件中进行适当的修改和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值