sqoop创建impala镶木桌

时间:2017-02-08 15:02:12

标签: bash hadoop sqoop impala parquet

我对sqooping的过程相对较新,所以请原谅任何无知。我一直试图将数据源中的表作为镶木地板文件进行sqoop,并创建一个impala表(也作为镶木地板),我将插入sqooped数据。代码运行没有问题,但当我尝试选择几行进行测试时,我得到错误:

.../EWT_CALL_PROF_DIM_SQOOP/ec2fe2b0-c9fa-4ef9-91f8-46cf0e12e272.parquet' has an incompatible Parquet schema for column 'dru_id.test_ewt_call_prof_dim_parquet.call_prof_sk_id'. Column type: INT, Parquet schema: optional byte_array CALL_PROF_SK_ID [i:0 d:1 r:0]

我正在镜像我在cloudera指南上找到的过程:https://www.cloudera.com/documentation/enterprise/5-8-x/topics/impala_create_table.html。主要是“内部和外部表”部分。我一直试图避免不得不用特定的镶木地板文件来推断架构,因为整个事情每个月都会用bash脚本启动(我也想不到一种方法可以将它指向一个文件如果我使用多个映射器。)

这是我使用的代码。我觉得我要么缺少一些小而愚蠢的东西,要么我已经搞砸了所有重要的事情而没有意识到这一点。任何和所有帮助表示赞赏。谢谢!

    sqoop import -Doraoop.import.hint=" " \
    --options-file /home/kemri/pass.txt \
    --verbose \
    --connect jdbc:oracle:thin:@ldap://oid:389/cn=OracleContext,dc=[employer],dc=com/EWSOP000 \
    --username [userid] \
    --num-mappers 1 \
    --target-dir hdfs://nameservice1/data/res/warehouse/finance/[dru_userid]/EWT_CALL_PROF_DIM_SQOOP \
    --delete-target-dir \
    --table DMPROD.EWT_CALL_PROF_DIM \
    --direct \
    --null-string '\\N' \
    --null-non-string '\\N' \
    --as-parquetfile 


impala-shell -k -i hrtimpslb.[employer].com


create external table test_EWT_CALL_PROF_DIM_parquet(
CALL_PROF_SK_ID INT,
SRC_SKL_CD_ID STRING,
SPLIT_NM STRING,
SPLIT_DESC STRING,
CLM_SYS_CD STRING,
CLM_SYS_NM STRING,
LOB_CD STRING,
LOB_NM STRING,
CAT_IND STRING,
CALL_TY_CD STRING,
CALL_TY_NM STRING,
CALL_DIR_CD STRING,
CALL_DIR_NM STRING,
LANG_CD STRING,
LANG_NM STRING,
K71_ATOMIC_TS TIMESTAMP)
stored as parquet location '/data/res/warehouse/finance/[dru_userid]/EWT_CALL_PROF_DIM_SQOOP';

1 个答案:

答案 0 :(得分:0)

根据评论中的请求,我提供了一个示例,说明如何使用--hive-import的一个sqoop导入来实现相同的目标。出于显而易见的原因,我还没有针对您的特定要求对其进行测试,因此可能需要更多调整,这通常是这些sqoop命令的情况。 根据我的经验,导入为镶木地板会强制您使用--query选项,因为它不允许您将schema.table用作表格。

sqoop import -Doraoop.import.hint=" "\
--verbose \
--connect jdbc:oracle:thin:@ldap://oid:389/cn=OracleContext,dc=[employer],dc=com/EWSOP000 \
--username [userid] \
-m 1 \
--password [ifNecessary] \
--hive-import \
--query 'SELECT * FROM DMPROD.EWT_CALL_PROF_DIM WHERE $CONDITIONS' \
--hive-database [database you want to use] \
--hive-table test_EWT_CALL_PROF_DIM_parquet \
--target-dir hdfs://nameservice1/data/res/warehouse/finance/[dru_userid]/EWT_CALL_PROF_DIM_SQOOP \
--null-string '\\N' \
--null-non-string '\\N' \
--as-parquetfile

--hive-import --hive-database--hive-table--query基本上需要--map-hive-columns [column_name1=Timestamp,column_name2=Int,...] 。 如果您不希望所有列都以字符串形式显示在Hive中,则还必须包括:

--map-java-columns

您可能也需要类似的--split-by,但我不确定何时需要这样做。 如果您需要多个映射器,则需要invalidate metadata db.table

正如评论中所述,您需要使用impala-shell -q [query]来确保Impala看到这些更改。您可以从CL或单个bash脚本发出这两个命令,您可以使用$('#myForm').submit(function() { // get all the inputs into an array. var $inputs = $('#myForm :input'); // get an associative array of objects. var values = {}; $inputs.each(function() { values[this.name] = $(this).val(); }); // Process Dates from form data Format Should be 2016-01-01T16:51:57.000+0000 StartDate = values.datastartdate + "T" + values.datastarttime + ".000+0000"; EndDate = values.dataenddate + "T" + values.dataendtime + ".000+0000"; // Data to Submit var formData = { 'db': values.db, 'Start': StartDate.toString(), 'End': EndDate.toString() }; //Use Ajax to submit the form data $.ajax({ url: "http://localhost:3000/api/v1/imagelist_data/", type: 'POST', data: formData, success: function(result) { // ... Process the result ... //alert(formData.db + formData.Start + formData.End); alert(result); Newvalues = result; } }); //$('#example').empty(); table.ajax.reload( function ( json ) { Newvalues = json; }); }); 发出impala命令。