HIVE多行到列

时间:2018-06-13 14:27:44

标签: hadoop hive pivot

我有一个正在处理的文件,我正在尝试将多行与相同的键组合成一行中的列。

我的输入是

rental_company  field_name          field_data      location_identifier
hertz           branchName          ANNABA AIRPORT  RCCTHERTZAAEREC000002
hertz           branchCode          AAE             RCCTHERTZAAEREC000002
hertz           countryCd           DZ              RCCTHERTZAAEREC000002
hertz           isAtAirport         true            RCCTHERTZAAEREC000002
hertz           branchPhone         0555066233      RCCTHERTZAAEREC000002
hertz           branchHoursMon      08:00-20:00     RCCTHERTZAAEREC000002
hertz           branchHoursTue      08:00-20:00     RCCTHERTZAAEREC000002
hertz           branchHoursWed      08:00-20:00     RCCTHERTZAAEREC000002
hertz           branchHoursThu      08:00-20:00     RCCTHERTZAAEREC000002
hertz           branchHoursFri      closed          RCCTHERTZAAEREC000002
hertz           branchHoursSat      closed          RCCTHERTZAAEREC000002
hertz           branchHoursSun      08:00-20:00     RCCTHERTZAAEREC000002
hertz           isParticipating     false           RCCTHERTZAAEREC000002
hertz           airportCode         AAE             RCCTHERTZAAEREC000002
hertz           shuttleServiceInd   false           RCCTHERTZAAEREC000002

我要输出的是

location_identifier                 branchName          branchCode  branchPhone
-----------------------------       ------------        ----------  --------------
RCCTENTERPRISEE10101REC000002       LADUE RENTAL        E10101      (314) 863 6886

我厌倦了使用以下内容:

SELECT
   location_identifier,
   kv('branchName') as branchName,
   kv('branchCode') as branchCode,
   kv('branchPhone') as branchPhone
FROM (
   SELECT location_identifier, to_map(field_name, field_data) kv
   FROM vtable
   GROUP BY location_identifier
      ) t;

我最终得到以下错误:表达式不在GROUP BY键'field_data'中,当我添加field_data时,我最终得到的错误是to_map无法识别。我试图使用以下示例: https://docs.treasuredata.com/articles/sql-tips#use-of-pivot--unpivot

2 个答案:

答案 0 :(得分:0)

  • to_map无法识别是因为,Hive没有该功能。
  • 使用[]从地图功能中提取值。
  • vtable很可能是不正确的表。用你的表名替换它。

    SELECT
        location_identifier,
        kv['branchName'] as branchName,
        kv['branchCode'] as branchCode,
        kv['branchPhone'] as branchPhone
    FROM 
    (
        SELECT location_identifier, to_map(field_name, field_data) kv
        FROM YourTableName
        GROUP BY location_identifier
    ) t;
    

答案 1 :(得分:0)

在解析出表以获取分区日期后,我能够使用以下代码执行此操作:

SELECT 
    location_identifier,
    partition_dt,
    collect_list(field_data)
FROM vtable
GROUP BY location_identifier, partition_dt;

从这里开始,我将在另一个表上进行连接,并将数据解析到我的最终表的正确列中。