java.lang.ClassCastException: org.apache.hadoop.hive.ql.io.orc.OrcStruct не может быть приведен к org.apache.hadoop.io.Text. Ошибка с JSON Serde

Я новичок в работе с данными JSON на улей. Я работаю над приложением spark, которое получает данные json и сохраняет их в таблицах улья. У меня есть JSON, как это:

Json of Jsons

который выглядит так, когда развернут:

иерархия

Я могу прочитать JSON в кадре данных и сохранить его в месте на HDFS. Но получить улей, чтобы иметь возможность читать данные, является сложной частью.

Например, после поиска в Интернете я попытался сделать это:

с использованием STRUCT для всех полей JSON, а затем получить доступ к элементам, используя column.element,

Например:

web_app_security будет именем столбца (типа STRUCT) внутри стола и других jsons в нем вроде config_web_cms_authentication, web_threat_intel_alert_external также будет структура (с rating а также rating_numeric как поля).

Я попытался создать таблицу с помощью JSON Serde. вот мое определение таблицы:

CREATE EXTERNAL TABLE jsons (
web_app_security struct<config_web_cms_authentication: struct<rating: string, rating_numeric: float>, web_threat_intel_alert_external: struct<rating: string, rating_numeric: float>, web_http_security_headers: struct<rating: string, rating_numeric: float>, rating: string, rating_numeric: float>,
dns_security struct<domain_hijacking_protection: struct<rating: string, rating_numeric: float>, rating: string, rating_numeric: float, dns_hosting_providers: struct<rating:string, rating_numeric: float>>,
email_security struct<rating: string, email_encryption_enabled: struct<rating: string, rating_numeric: float>, rating_numeric: float, email_hosting_providers: struct<rating: string, rating_numeric: float>, email_authentication: struct<rating: string, rating_numeric: float>>,
threat_intell struct<rating: string, threat_intel_alert_internal_3: struct<rating: string, rating_numeric: float>, threat_intel_alert_internal_1: struct<rating: string, rating_numeric: float>, rating_numeric: float,  threat_intel_alert_internal_12: struct<rating: string, rating_numeric: float>, threat_intel_alert_internal_6: struct<rating: string, rating_numeric: float>>,
data_loss struct<data_loss_6: struct<rating: string, rating_numeric: float>, rating: string, data_loss_36plus: struct<rating: string, rating_numeric: float>, rating_numeric: float,  data_loss_36: struct<rating: string, rating_numeric: float>, data_loss_12: struct<rating: string, rating_numeric: float>, data_loss_24: struct<rating: string, rating_numeric: float>>,
system_hosting struct<host_hosting_providers: struct<rating: string, rating_numeric: float>,  hosting_countries: struct<rating: string, rating_numeric: float>, rating: string, rating_numeric: float>,
defensibility struct<attack_surface_web_ip: struct<rating: string, rating_numeric: float>, shared_hosting: struct<rating: string, rating_numeric: float>, defensibility_hosting_providers: struct<rating: string, rating_numeric: float>, rating: string, rating_numeric: float, attack_surface_web_hostname: struct<rating: string, rating_numeric: float>>,
software_patching struct<patching_web_cms: struct<rating: string, rating_numeric: float>, rating: string, patching_web_server: struct<rating: string, rating_numeric: float>, patching_vuln_open_ssl: struct<rating: string, rating_numeric: float>, patching_app_server: struct<rating: string, rating_numeric: float>, rating_numeric: float>,
governance struct<governance_customer_base: struct<rating: string, rating_numeric: float>, governance_security_certifications: struct<rating: string, rating_numeric: float>, governance_regulatory_requirements: struct<rating: string, rating_numeric: float>, rating: string, rating_numeric: float>
)ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
STORED AS orc
LOCATION 'hdfs://nameservice1/data/gis/final/rr_current_analysis'

Я пытался разобрать строки с помощью JSON Serde. После того, как я сохранил некоторые данные в таблицу, я получаю следующую ошибку, когда пытаюсь сделать запрос:

Error: java.io.IOException: java.lang.ClassCastException: org.apache.hadoop.hive.ql.io.orc.OrcStruct cannot be cast to org.apache.hadoop.io.Text (state=,code=0)

Я не уверен, правильно ли я это делаю.

Я открыт для любых других способов хранения данных в таблице. Любая помощь будет оценена. Спасибо.

1 ответ

Это потому, что вы смешиваете ORC как хранилище (STORED AS orc) и JSON как SerDe (ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe') переопределение по умолчанию ORC OrcSerde SerDe, но не вход (OrcInputFormat) и вывод (OrcOutputFormat) форматы.

Вам также нужно использовать хранилище ORC без переопределения его SerDe по умолчанию. В этом случае убедитесь, что приложение Spark записывает в таблицы ORC, а не в JSON.

Или, если вы хотите, чтобы данные были сохранены в JSON, используйте JsonSerDe вместе с простым текстовым файлом в качестве хранилища (STORED AS TEXTFILE).


В Руководстве разработчика Hive есть объяснение того, как работают SerDe и Storage - https://cwiki.apache.org/confluence/display/Hive/DeveloperGuide.

Другие вопросы по тегам