【问题标题】:Date variable is NULL while loading csv data into hive External table将 csv 数据加载到 hive 外部表时,日期变量为 NULL
【发布时间】:2016-02-13 10:41:55
【问题描述】:

我正在尝试将 SAS 数据集加载到 Hive 外部表。为此,我首先将 SAS 数据集转换为 CSV 文件格式。在 sas 数据集中,日期变量(即 as_of_dt) 内容显示如下: LENGTH=8 , FORMAT= DATE9. , INFORMAT=DATE9. , LABLE=as_of_dt 为了将 SAS 转换为 CSV,我使用了下面的代码补丁(我之前在 sas 中使用过'retain'语句,以便保持变量的顺序):

proc export data=input_SASdataset_for_csv_conv
        outfile=  "/mdl/myData/final_merged_table_201501.csv"
        dbms=csv
        replace;
        putnames=no;
run;

直到这里(即创建 csv 文件),Date 变量被正确读取。但在此之后,当我在 HIVE 中使用以下命令将其加载到 Hive 外部表中时,DATE 变量(即 as_of_dt)被分配为 NULL

CREATE EXTERNAL TABLE final_merged_table_20151(as_of_dt DATE, client_cm_id STRING, cm11 BIGINT, cm_id BIGINT, corp_id BIGINT, iclic_id STRING, mkt_segment_cd STRING, product_type_cd STRING, rated_company_id STRING, recovery_amt DOUBLE, total_bal_amt DOUBLE, write_off_amt DOUBLE) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE LOCATION '/mdl/myData';

另外,当我在 hive desc formatted final_merged_table_201501 中使用此命令时,我会得到下表参数:

Table Parameters:
    COLUMN_STATS_ACCURATE   false
    EXTERNAL                TRUE
    numFiles                0
    numRows                 -1
    rawDataSize             -1
    totalSize               0
    transient_lastDdlTime   1447151851

但即使它显示 numRows=-1,我仍然可以通过使用 hive 命令 SELECT * FROM final_merged_table_20151 limit 10; 将日期变量 (as_of_dt) 存储为 NULL 来查看表内的数据。 问题可能出在哪里?

【问题讨论】:

  • 如果字符串的格式为 'YYYY-MM-DD',则返回对应于该年/月/日的日期值。如果字符串值与此格式不匹配,则在 Hive 中将返回 NULL

标签: csv hadoop hive sas


【解决方案1】:

根据 madhu 的评论,您需要将 as_of_dt 上的格式更改为 yymmdd10。

您可以使用 PROC DATASETS 做到这一点。这是一个例子:

data test;
   /*Test data with AS_OF_DT formatted date9. per your question*/
   format as_of_dt date9.;
   do as_of_dt=today() to today()+5;
      output;
   end;
run;

proc datasets lib=work nolist;
/*Modify Test Data Set and set format for AS_OF_DT variable*/
   modify test;
     attrib as_of_dt format=yymmdd10.;
   run;
quit;

/*Create CSV*/
proc export file="C:\temp\test.csv"
            data=test
            dbms=csv
            replace;
        putnames=no;
run;

如果您打开 CSV,您将看到 YYYY-MM-DD 格式的日期。

【讨论】:

  • 感谢您的回复,成功了。再问一个问题,Hive 表参数仍然显示如下结果(即使 csv 和 hive 表之间存在一对一匹配):Table Parameters: COLUMN_STATS_ACCURATE false EXTERNAL TRUE numFiles 0 numRows -1 rawDataSize -1 totalSize 0 transient_lastDdlTime 1447151851 是否有一些问题仍然存在?
  • 抱歉,我对 Hive 没有任何经验。也许您可以将此作为一个单独的问题提出,Hive 专家可以为您解答。
猜你喜欢
  • 2021-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-27
  • 1970-01-01
  • 2019-06-24
  • 1970-01-01
  • 2018-01-23
相关资源
最近更新 更多