В Pyspark не работает фильтрация разделенной таблицы искр - PullRequest
0 голосов
/ 19 ноября 2018

Я использую spark 2.3 и написал один фрейм данных для создания многораздельной таблицы улья, используя метод класса записи фреймов в pyspark.

newdf.coalesce(1).write.format('orc').partitionBy('veh_country').mode("overwrite").saveAsTable('emp.partition_Load_table')

Вот моя структура таблицы и информация о разделах.

hive> desc emp.partition_Load_table;
OK
veh_code                varchar(17)
veh_flag                varchar(1)
veh_model               smallint
veh_country             varchar(3)

# Partition Information
# col_name              data_type               comment

veh_country              varchar(3)

hive> show partitions partition_Load_table;
OK
veh_country=CHN
veh_country=USA
veh_country=RUS

Теперь я читаю эту таблицу обратно в pyspark внутри фрейма данных.

    df2_data = spark.sql("""
    SELECT * 
    from udb.partition_Load_table
    """);

df2_data.show() --> is working

Но я не могу отфильтровать его, используя столбец ключа раздела

from pyspark.sql.functions import col
newdf = df2_data.where(col("veh_country")=='CHN')

Я получаю сообщение об ошибке ниже:

: java.lang.RuntimeException: Caught Hive MetaException attempting to get partition metadata by filter from Hive. 
You can set the Spark configuration setting spark.sql.hive.manageFilesourcePartitions to false to work around this problem, 
however this will result in degraded performance. Please report a bug: https://issues.apache.org/jira/browse/SPARK
Caused by: MetaException(message:Filtering is supported only on partition keys of type string)

тогда как при создании фрейма данных указывается абсолютный путь hdfs таблицы. фильтр и предложение where работает как положено.

newdataframe = spark.read.format("orc").option("header","false").load("hdfs/path/emp.db/partition_load_table")

ниже работает

newdataframe.where(col("veh_country")=='CHN').show()

мой вопрос в том, почему он не смог отфильтровать фрейм данных в первую очередь. а также почему выдается сообщение об ошибке «Фильтрация поддерживается только для ключей секционирования типа string», даже если мой veh_country определен как тип данных string или varchar.

1 Ответ

0 голосов
/ 05 августа 2019

Я тоже наткнулся на этот вопрос. Что помогло мне было сделать эту строку:

spark.sql("SET spark.sql.hive.manageFilesourcePartitions=False")

и затем используйте spark.sql(query) вместо использования фрейма данных.

Я не знаю, что происходит под капотом, но это решило мою проблему.

Хотя это может быть слишком поздно для вас (поскольку этот вопрос был задан 8 месяцев назад), это может помочь другим людям.

...