Как определить секционированную внешнюю таблицу для вложенной структуры каталогов

Для набора файлов данных, хранящихся в hdfs в структуре year/*.csv следующим образом:

$ hdfs dfs -ls air/


    Found 21 items
air/year=2000
    drwxr-xr-x   - hadoop hadoop          0 2019-03-08 01:45 air/year=2001
    drwxr-xr-x   - hadoop hadoop          0 2019-03-08 01:45 air/year=2002
    drwxr-xr-x   - hadoop hadoop          0 2019-03-08 01:45 air/year=2003
    drwxr-xr-x   - hadoop hadoop          0 2019-03-08 01:45 air/year=2004
    drwxr-xr-x   - hadoop hadoop          0 2019-03-08 01:45 air/year=2005
    drwxr-xr-x   - hadoop hadoop          0 2019-03-08 01:45 air/year=2006
    drwxr-xr-x   - hadoop hadoop          0 2019-03-08 01:45 air/year=2007
    drwxr-xr-x   - hadoop hadoop          0 2019-03-08 01:45 air/year=2008

Есть 12 csv файлов - по одному на каждый месяц. Поскольку наши запросы не заботятся о детализации по месяцам, можно поместить все месяцы года в один каталог. Вот содержимое одного из лет: обратите внимание, это .csv файлы:

[hadoop@ip-172-31-25-82 ~]$ hdfs dfs -ls air/year=2008


Found 10 items
-rw-r--r--   2 hadoop hadoop  193893785 2019-03-07 23:49 air/year=2008/On_Time_On_Time_Performance_2008_1.csv
-rw-r--r--   2 hadoop hadoop  199126288 2019-03-07 23:49 air/year=2008/On_Time_On_Time_Performance_2008_10.csv
-rw-r--r--   2 hadoop hadoop  182225240 2019-03-07 23:49 air/year=2008/On_Time_On_Time_Performance_2008_2.csv
-rw-r--r--   2 hadoop hadoop  197399305 2019-03-07 23:49 air/year=2008/On_Time_On_Time_Performance_2008_3.csv
-rw-r--r--   2 hadoop hadoop  191321415 2019-03-07 23:49 air/year=2008/On_Time_On_Time_Performance_2008_4.csv
-rw-r--r--   2 hadoop hadoop  194141438 2019-03-07 23:49 air/year=2008/On_Time_On_Time_Performance_2008_5.csv
-rw-r--r--   2 hadoop hadoop  195477306 2019-03-07 23:49 air/year=2008/On_Time_On_Time_Performance_2008_6.csv
-rw-r--r--   2 hadoop hadoop  201148079 2019-03-07 23:49 air/year=2008/On_Time_On_Time_Performance_2008_7.csv
-rw-r--r--   2 hadoop hadoop  219060870 2019-03-07 23:49 air/year=2008/On_Time_On_Time_Performance_2008_8.csv
-rw-r--r--   2 hadoop hadoop  172127584 2019-03-07 23:49 air/year=2008/On_Time_On_Time_Performance_2008_9.csv

Заголовок и одна строка выглядят так:

hdfs dfs -cat airlines/2008/On_Time_On_Time_Performance_2008_4.csv | head -n 2


  "Year","Quarter","Month","DayofMonth","DayOfWeek","FlightDate","UniqueCarrier","AirlineID","Carrier","TailNum","FlightNum","Origin","OriginCityName","OriginState","OriginStateFips","OriginStateName","OriginWac","Dest","DestCityName","DestState","DestStateFips","DestStateName","DestWac","CRSDepTime","DepTime","DepDelay","DepDelayMinutes","DepDel15","DepartureDelayGroups","DepTimeBlk","TaxiOut","WheelsOff","WheelsOn","TaxiIn","CRSArrTime","ArrTime","ArrDelay","ArrDelayMinutes","ArrDel15","ArrivalDelayGroups","ArrTimeBlk","Cancelled","CancellationCode","Diverted","CRSElapsedTime","ActualElapsedTime","AirTime","Flights","Distance","DistanceGroup","CarrierDelay","WeatherDelay","NASDelay","SecurityDelay","LateAircraftDelay",

2008,2,4,3,4,2008-04-03,"WN",19393,"WN","N601WN","3599","MAF","Midland/Odessa, TX","TX","48","Texas",74,"DAL","Dallas, TX","TX","48","Texas",74,"1115","1112",-3.00,0.00,0.00,-1,"1100-1159",10.00,"1122","1218",6.00,"1220","1224",4.00,4.00,0.00,0,"1200-1259",0.00,"",0.00,65.00,72.00,56.00,1.00,319.00,2,,,,,,

Возникает вопрос: как «убедить» hive / spark прочитать это содержимое правильно? Подход:

  • Последний столбец year будет автоматически прочитан кустом из-за partitioning
  • The first column YearIn will be a placeholder: its value will be read in but my application code will ignore it in favor of the year partitioning column
    • All other fields are handled without any special considerations

Вот моя попытка.

create external table air (
YearIn string,Quarter string,Month string, 
 .. _long list of columns_ ..) 
partitioned by (year int) 
row format delimited fields terminated by ',' location '/user/hadoop/air/';

Результаты следующие:

  • таблица создается и доступна как hive, так и `spark
  • Но таблица пуста - как сообщают hive и spark

Что не так в этом процессе?


person WestCoastProjects    schedule 08.03.2019    source источник


Ответы (1)


Определение таблицы выглядит хорошо, за исключением заголовков. Если вы не пропустите заголовки, тогда в наборе данных будут возвращены строки заголовков, а если некоторые столбцы не являются строками, значения заголовков будут выбраны как NULLs. Чтобы не выделять заголовки, добавьте это в конец таблицы DDL tblproperties("skip.header.line.count"="1") - это свойство поддерживается только в Hive, прочтите также этот обходной путь: https://stackoverflow.com/a/54542483/2700344

Помимо создания таблицы, вам необходимо создать разделы.

Используйте команду MSCK [REPAIR] TABLE Air;.

Эквивалентная команда в версии Hive Amazon Elastic MapReduce (EMR): ALTER TABLE Air RECOVER PARTITIONS.

Это добавит метаданные разделов Hive. См. Руководство здесь: ВОССТАНОВЛЕНИЕ РАЗДЕЛОВ

person leftjoin    schedule 08.03.2019
comment
Gr8 - спасибо за подробности. Подобные ответы делают SOF бесценным. Я выбрал для этой задачи несекционированную таблицу из-за нехватки времени, но могу попробовать это в следующий раз. - person WestCoastProjects; 08.03.2019
comment
@javadba Большое спасибо за такие вдохновляющие слова. - person leftjoin; 08.03.2019