Spark Dataframe из SQL-запросов - PullRequest
0 голосов
/ 09 июля 2019

Я пытаюсь использовать Apache Spark для загрузки результатов (большого) запроса SQL с несколькими объединениями и вложенными выборками в DataFrame из Spark, как описано в Создание Spark Dataframe из SQL-запроса .

К сожалению, мои попытки сделать это приводят к ошибке от Parquet:

Исключение в потоке "main" org.apache.spark.sql.AnalysisException: Невозможно определить схему для паркета. Должен быть указан вручную.

Я видел информацию от Google, подразумевающую, что эта ошибка возникает, когда DataFrame пуст. Однако результаты запроса загружают множество строк в DBeaver.

Вот пример запроса:

(SELECT REPORT_DATE, JOB_CODE, DEPT_NBR, QTY
    FROM DBO.TEMP 
    WHERE  BUSINESS_DATE = '2019-06-18' 
    AND   STORE_NBR IN (999) 
    ORDER BY BUSINESS_DATE) as reports

Мой код Spark выглядит следующим образом.

val reportsDataFrame = spark
  .read
  .option("url", db2JdbcUrl)
  .option("dbtable", queries.reports)
  .load()

scheduledHoursDf.show(10)

В предыдущем ответе я прочитал, что с помощью этого метода можно выполнять запросы ко всей базе данных. В частности, это, если вы укажете параметр «dbtable» как псевдоним запроса при первой сборке DataFrame в Spark. Вы можете видеть, что я сделал это в запросе, указав весь запрос для псевдонима «как отчеты».

Я не верю, что это дублирующий вопрос. Я тщательно исследовал эту конкретную проблему и не нашел никого, кто сталкивался бы с такой же проблемой в Интернете. В частности, ошибка Parquet в результате выполнения запроса.

Кажется, консенсус заключается в том, что не следует запускать SQL-запросы таким образом, а вместо этого следует использовать множество методов DataFrames Spark для фильтрации, группировки и агрегирования данных. Однако для нас было бы очень полезно иметь возможность использовать сырой SQL вместо этого, даже если это повлечет за собой снижение производительности.

1 Ответ

3 голосов
/ 09 июля 2019

Быстрый просмотр вашего кода говорит о том, что вы пропали без вести .format("jdbc")

val reportsDataFrame = spark
  .read
  .format("jdbc")
  .option("url", db2JdbcUrl)
  .option("dbtable", queries.reports)
  .load()

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

Хороший ресурс дляузнать больше об источниках JDBC в искре (https://spark.apache.org/docs/latest/sql-data-sources-jdbc.html)

...