Каков наилучший способ объединения нескольких таблиц соединений jdb c в spark? - PullRequest
1 голос
/ 31 января 2020

Я пытаюсь перенести запрос в pyspark, и мне нужно объединить в нем несколько таблиц. Все таблицы в Redshift, и я использую разъем jdb c, чтобы поговорить с ними.

Моя проблема в том, как сделать эти объединения оптимальным образом, не считывая слишком много данных (т. Е. Загрузить таблицу и соединение по ключу), и просто без явного использования:

spark.sql("""join table1 on x=y join table2 on y=z""")

Есть ли способ отправить запросы в Redshift, но при этом использовать API Spark df для записи логики c, а также использовать df из контекста spark без сохранения их в Redshift только для объединений?

1 Ответ

1 голос
/ 01 февраля 2020

Пожалуйста, найдите следующие моменты, которые следует учитывать:

  • Соединитель вызовет sh -для указанных фильтров, только если в вашем коде Spark указан какой-либо фильтр, например select * from tbl where id > 10000. Вы можете подтвердить это самостоятельно, просто проверь ответственный Scala код . Также здесь является соответствующим тестом, который демонстрирует именно это. Тест test("buildWhereClause with multiple filters") пытается проверить, что переменная expectedWhereClause равна whereClause, сгенерированной соединителем. Сгенерированное условие where должно быть:
"""
        |WHERE "test_bool" = true
        |AND "test_string" = \'Unicode是樂趣\'
        |AND "test_double" > 1000.0
        |AND "test_double" < 1.7976931348623157E308
        |AND "test_float" >= 1.0
        |AND "test_int" <= 43
        |AND "test_int" IS NOT NULL
        |AND "test_int" IS NULL
      """

, которое произошло из Spark-filters, указанного выше.

  • Драйвер также поддерживает column filtering. Это означает, что он будет загружать только необходимые столбцы, нажав на допустимые столбцы для красного смещения. Вы можете снова проверить это из соответствующего теста Scala («DefaultSource поддерживает простую фильтрацию столбцов») * теста 1025 * и («запрос с сокращенными и отфильтрованными сканированиями») .

  • Хотя в вашем случае вы не указали никаких фильтров в запросе на соединение, следовательно, Spark не может использовать две предыдущие оптимизации. Если вам известны такие фильтры, пожалуйста, не стесняйтесь их применять.

  • Последнее, но не менее важное, и, как уже упоминал Салим, официальный Spark-разъем для красного смещения можно найти здесь . Разъем Spark построен поверх драйвера Amazon Redshift JDB C , поэтому он будет пытаться использовать его в любом случае, как указано в коде .

...