Операция сохранения как таблицы завершается неудачно, когда элемент типа структуры имеет поля со специальным символом для SPARK - PullRequest
0 голосов
/ 14 мая 2018

У меня ниже XML, который я пытаюсь прочитать через SPARK XML:

<revolt>
    <revolt_configuration>
        <id>102</id>
        <noncontroversial>
            <validation_method>SPARK</validation_method>
            <validation-timeout>5</validation-timeout>
        </noncontroversial>
    </revolt_configuration>
</revolt>

Пожалуйста, обратите внимание на поле 'validation-timeout' под неоспоримыми

Я использую код ниже, чтобы прочитатьXML:

df = spark.read.format('com.databricks.spark.xml').option('rowTag','revolt_configuration').load('data')

и печать схемы, которую я получаю ниже выходного корня

|-- id: long (nullable = true)
|-- testvalidationcontroller: struct (nullable = true)
|    |-- validation-timeout: long (nullable = true)
|    |-- validation_method: string (nullable = true)

При попытке сохранить этот фрейм данных в таблицу кустов я получаю исключение ниже

Caused by: java.lang.IllegalArgumentException: Error: : expected at the position 24 of 'bigint:struct<validation-timeout:bigint,validation_method:string>' but '-' is found.
        at org.apache.hadoop.hive.serde2.typeinfo.TypeInfoUtils$TypeInfoParser.expect(TypeInfoUtils.java:360)
        at org.apache.hadoop.hive.serde2.typeinfo.TypeInfoUtils$TypeInfoParser.expect(TypeInfoUtils.java:331)
        at org.apache.hadoop.hive.serde2.typeinfo.TypeInfoUtils$TypeInfoParser.parseType(TypeInfoUtils.java:483)
        at org.apache.hadoop.hive.serde2.typeinfo.TypeInfoUtils$TypeInfoParser.parseTypeInfos(TypeInfoUtils.java:305)
        at org.apache.hadoop.hive.serde2.typeinfo.TypeInfoUtils.getTypeInfosFromTypeString(TypeInfoUtils.java:765)
        at org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe.initialize(ParquetHiveSerDe.java:111)
        at org.apache.hadoop.hive.serde2.AbstractSerDe.initialize(AbstractSerDe.java:53)
        at org.apache.hadoop.hive.serde2.SerDeUtils.initializeSerDe(SerDeUtils.java:521)
        at org.apache.hadoop.hive.metastore.MetaStoreUtils.getDeserializer(MetaStoreUtils.java:391)
        at org.apache.hadoop.hive.ql.metadata.Table.getDeserializerFromMetaStore(Table.java:276)
        at org.apache.hadoop.hive.ql.metadata.Table.checkValidity(Table.java:197)
        at org.apache.hadoop.hive.ql.metadata.Hive.createTable(Hive.java:699)
        ... 44 more

Обратите внимание, что эта проблема не связана с XML, поскольку я столкнулся с аналогичной проблемой при чтении данных на основе JSON

Если поле struct не содержит никаких специальных символов, тогда операция сохранения как таблицы работает правильно.

1 Ответ

0 голосов
/ 30 мая 2018

Далее я углубляюсь в эту проблему и 1. Кажется, что эта проблема возникла из мета-хранилища улья, поскольку при попытке выполнить запрос с вложенным столбцом, содержащим специальные символы, и, несмотря на добавление обратного ключа, это не помогло мне 2. Я решилЭта проблема заключается в явной передаче выражения SQL во фрейм данных путем обновления специального символа из подколонок

Ex

source data :
{
  "address": {
    "lane-one": "mark street",
    "lane:two": "sub stree"
 }
}

КОД Python:

schema = 'struct<lane_one:string, lane_two:string>'
data_frame_from_json.select(col('address').cast(schema))

Я проверилданные для гораздо более сложной структуры JSON и XML, и это выглядит хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...