Доступ к таблицам кустов из Spark SQL при хранении данных в хранилище объектов - PullRequest
0 голосов
/ 18 декабря 2018

Я использую искатель DataFrame Writer для записи данных во внутренние таблицы кустов в формате паркета в IBM Cloud Object Storage.Итак, мое хранилище метаданных находится в кластере HDP, и я запускаю искровое задание из кластера HDP.Это искровое задание записывает данные в IBM COS в формате паркета.Вот как я запускаю сеанс spark

SparkSession session = SparkSession.builder().appName("ParquetReadWrite")
                                .config("hive.metastore.uris", "<thrift_url>")
                                .config("spark.sql.sources.bucketing.enabled", true)
                                .enableHiveSupport()
                                .master("yarn").getOrCreate();
session.sparkContext().hadoopConfiguration().set("fs.cos.mpcos.iam.api.key",credentials.get(ConnectionConstants.COS_APIKEY));
session.sparkContext().hadoopConfiguration().set("fs.cos.mpcos.iam.service.id",credentials.get(ConnectionConstants.COS_SERVICE_ID));
session.sparkContext().hadoopConfiguration().set("fs.cos.mpcos.endpoint",credentials.get(ConnectionConstants.COS_ENDPOINT));

Проблема, с которой я сталкиваюсь, заключается в том, что когда я разбиваю данные и сохраняю их (через partitionBy), я не могу получить доступ к данным напрямую из spark sql

spark.sql("select * from partitioned_table").show

Чтобы извлечь данные из секционированной таблицы, я должен загрузить фрейм данных и зарегистрировать его как временную таблицу, а затем запросить ее.Вышеуказанная проблема не возникает, когда таблица не разделена.Код для записи данных следующий:

dfWithSchema.orderBy(sortKey).write()
                                .partitionBy("somekey")
                                .mode("append")
                                .format("parquet")
                                .option("path",PARQUET_PATH+tableName )
                                .saveAsTable(tableName);

Есть идеи, почему подход с прямым запросом не работает для секционированных таблиц в COS / Parquet?

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

Эта проблема возникает, когда для свойства hive.metastore.try.direct.sql установлено значение true в конфигурациях HiveMetastore, а запрос SparkSQL выполняется над столбцом раздела не типа STRING.

Для Spark рекомендуется создавать таблицы со столбцами разделов типа STRING.

Если вы получаете сообщение об ошибке ниже, когда фильтруете многораздельную таблицу куста в spark.

Caused by: MetaException(message:Filtering is supported only on partition keys of type string)

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

иначе вам нужно указать абсолютный путь к вашему местоположению hdfs, чтобы получить данные, если ваш многораздельный столбец был определен как varchar.

selected_Data=spark.read.format("parquet").option("header","false").load("hdfs/path/loc.db/partition_table")

Однако яне смог понять, почему он различает тип данных varchar и string для столбца раздела

0 голосов
/ 18 декабря 2018

Чтобы прочитать секционированную таблицу (созданную Spark), вам необходимо указать абсолютный путь к таблице, как показано ниже.

selected_Data=spark.read.format("parquet").option("header","false").load("hdfs/path/loc.db/partition_table")

Чтобы отфильтровать ее, попробуйте следующий подход.

selected_Data.where(col("column_name")=='col_value').show()
...