Проблема с вставкой данных

#hive #hdfs #hql

#улей #hdfs #hql

Вопрос:

Итак, у меня возникла эта проблема при добавлении CSV-файла в мой код HQL и запуске его в HDFS. я обнаружил, что при вставке данных он получает нули в частях раздела, а некоторые столбцы удаляются. я перепробовал много разных способов вставки данных, но все равно получаю эти странные символы и потерянные столбцы. похоже, что он не может прочитать файл CSV, вот изображение, введите описание изображения здесь, и вот код `

 CREATE database covid_db;

use covid_db;


SET hive.exec.dynamic.partition = true;
SET hive.exec.dynamic.partition.mode=nonstrict;
set hive.exec.max.dynamic.partitions=500;
set hive.exec.max.dynamic.partitions.pernode=500;


CREATE TABLE IF NOT EXISTS covid_db.covid_staging 
(
 Country                            STRING,
 Total_Cases                        DOUBLE,
 New_Cases                          DOUBLE,
 Total_Deaths                       DOUBLE,
 New_Deaths                         DOUBLE,
 Total_Recovered                    DOUBLE,
 Active_Cases                       DOUBLE,
 Serious                            DOUBLE,
 Tot_Cases                          DOUBLE,
 Deaths                             DOUBLE,
 Total_Tests                        DOUBLE,
 Tests                              DOUBLE,
 CASES_per_Test                     DOUBLE,
 Death_in_Closed_Cases              STRING,
 Rank_by_Testing_rate               DOUBLE,
 Rank_by_Death_rate                 DOUBLE,
 Rank_by_Cases_rate                 DOUBLE,
 Rank_by_Death_of_Closed_Cases      DOUBLE
)
ROW FORMAT DELIMITED FIELDS TERMINATED by ','
STORED as TEXTFILE
LOCATION '/user/cloudera/ds/COVID_HDFS_LZ'
tblproperties ("skip.header.line.count"="1", "serialization.null.format" = "''");

CREATE EXTERNAL TABLE IF NOT EXISTS covid_db.covid_ds_partitioned 
(
 Country                            STRING,
 Total_Cases                        DOUBLE,
 New_Cases                          DOUBLE,
 Total_Deaths                       DOUBLE,
 New_Deaths                         DOUBLE,
 Total_Recovered                    DOUBLE,
 Active_Cases                       DOUBLE,
 Serious                            DOUBLE,
 Tot_Cases                          DOUBLE,
 Deaths                             DOUBLE,
 Total_Tests                        DOUBLE,
 Tests                              DOUBLE,
 CASES_per_Test                     DOUBLE,
 Death_in_Closed_Cases              STRING,
 Rank_by_Testing_rate               DOUBLE,
 Rank_by_Death_rate                 DOUBLE,
 Rank_by_Cases_rate                 DOUBLE,
 Rank_by_Death_of_Closed_Cases      DOUBLE
)
PARTITIONED BY (COUNTRY_NAME STRING)
STORED as TEXTFILE
LOCATION '/user/cloudera/ds/COVID_HDFS_PARTITIONED';

FROM
covid_db.covid_staging
INSERT INTO TABLE covid_db.covid_ds_partitioned PARTITION(COUNTRY_NAME)
SELECT *,Country WHERE Country is not null;


CREATE EXTERNAL TABLE covid_db.covid_final_output 
(
 TOP_DEATH                          STRING,
 TOP_TEST                           STRING
)
PARTITIONED BY (COUNTRY_NAME STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED by ','
STORED as TEXTFILE
LOCATION '/user/cloudera/ds/COVID_FINAL_OUTPUT';
  

`

Ответ №1:

1-й: вы проверяете содержимое файла, и столбец раздела не сохраняется в файле, он сохраняется в метаданных. Также динамически создаваемым разделом являются каталоги в формате ключ = значение. Итак, последний столбец, который вы видите в файле, не является столбцом раздела, это Rank_by_Death_of_Closed_Cases .

2-й: вы не указали разделитель во второй таблице DDL, а также формат NULL. Разделителем по умолчанию является ’01’ (Ctrl-A). Вы можете указать разделитель, например TAB (t) и желаемый NULL:

 ROW FORMAT DELIMITED
FIELDS TERMINATED BY 't'
NULL DEFINED AS ''
STORED AS TEXTFILE;
  

Но лучше не переопределять формат NULL, если вы хотите иметь возможность различать нули и пустые строки.