Ссылка на представление Hive из задания AWS Glue - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь выяснить, как перенести сценарий использования из EMR в AWS Glue с использованием представлений Hive.

В EMR сегодня у меня есть внешние таблицы Hive, поддерживаемые Parquet в S3, и у меня есть дополнительныепредставления типа create view hive_view as select col from external_table where col = x

Затем в Spark на EMR я могу выдавать операторы типа df = spark.sql("select * from hive_view") для ссылки на представление Hive.

Я знаю, что могу использовать каталог Glue в качествевместо метастафа Hive, но я пытаюсь перенести саму работу Spark из EMR в Glue.Так что в моем конечном состоянии больше нет конечной точки Hive, только Клей.

Вопросы:

  • Как заменить оператор create view ..., если у меня больше нет кластера EMR для выдачи команд Hive?Что такое эквивалентный вызов AWS Glue SDK?

  • Как мне ссылаться на эти виды из задания Glue?

То, что я пробовал до сих пор: используя boto3 для вызова glue.create_table следующим образом

glue = boto3.client('glue')
glue.create_table(DatabaseName='glue_db_name', 
   TableInput = {'Name': 'hive_view', 
       'TableType': 'VIRTUAL_VIEW',
       'ViewExpandedText': 'select .... from ...'
    })

Я вижу объект, созданный в каталоге Glueно классификация отображается как «Неизвестно», и ссылки в задании не выполняются с соответствующей ошибкой:

py4j.protocol.Py4JJavaError: An error occurred while calling o56.getCatalogSource. : 
java.lang.Error: No classification or connection in bill_glue_poc.view_test at ...

Я подтвердил, что могу использовать представления Hive с Spark в EMR с каталогом Glue в качестве метастора -- Я вижу представление в каталоге Glue, и запросы Spark SQL выполняются успешно, но я не могу ссылаться на представление из задания Glue.

1 Ответ

0 голосов
/ 07 февраля 2019

Вы можете создать временное представление в Spark и запросить его как таблицу Hive (Scala):

val dataDyf = glueContext.getSourceWithFormat(
      connectionType = "s3",
      format = "parquet",
      options = JsonOptions(Map(
        "paths" -> Array("s3://bucket/external/folder")
      ))).getDynamicFrame()

// Convert DynamicFrame to Spark's DataFrame and apply filtering
val dataViewDf = dataDyf.toDF().where(...)

dataViewDf.createOrReplaceTempView("hive_view")

val df = spark.sql("select * from hive_view")
...