PySpark & ​​JDBC: Когда я должен использовать spark с JDBC? - PullRequest
0 голосов
/ 21 октября 2019

Я не очень знаком со Spark, поэтому, пожалуйста, прости меня, если это navie.


У меня есть озеро данных HDFS для работы, и данные можно запрашивать через Hive и Presto, Impala и Spark ( в кластере ).

Однако Spark не имеет встроенного контроля доступа, и по соображениям безопасности я могу использовать только Hive / Presto для запроса.

Мои вопросы

  • Можно ли установить spark локально (например, на моем ноутбуке) и использовать JDBC для подключения источника данных (Hive илиPresto) как в https://spark.apache.org/docs/latest/sql-data-sources-jdbc.html? Поэтому я могу запрашивать данные, используя синтаксис данных PySpark и Python вместо SQL, что для меня более продуктивно.

  • Чем это отличается от чтения данных с помощью Pandas? В Pandas данные загружаются прямо в мой ноутбук, поэтому я могу загрузить только ~ 1 млн строк данных, иначе загрузка займет слишком много времени. Будет ли Spark (установленный локально) отправлять запросы, ограничения и преобразования в источник данных ? В противном случае этот подход бесполезен.

  • Какая разница в скорости между использованием Presto (в кластере) и Spark (локальная машина) с jdbc до Presto?

Спасибо!

1 Ответ

1 голос
/ 21 октября 2019
  1. Да, вы можете установить spark локально и использовать JDBC для подключения к вашим базам данных. Вот функция, которая поможет вам подключиться к my-sql, которую вы можете обобщить для любого источника JDBC, изменив строку подключения JDBC:
def connect_to_sql(
        spark, jdbc_hostname, jdbc_port, database, data_table, username, password
):
    jdbc_url = "jdbc:mysql://{0}:{1}/{2}".format(jdbc_hostname, jdbc_port, database)

    connection_details = {
        "user": username,
        "password": password,
        "driver": "com.mysql.cj.jdbc.Driver",
    }

    df = spark.read.jdbc(url=jdbc_url, table=data_table, properties=connection_details)
    return df

Spark лучше справляется с большими данными, чем Pandas, даже на локальных машинах, но это приводит к снижению производительности из-за параллелизма и распределенных вычислений. Это определенно будет служить вашим целям в кластере, но локальный режим должен использоваться только для разработки.

Будьте уверены, Spark (установлен локально) будет push-запрос, ограничение и преобразование ограничения и даже лучше, если все сделано правильно. Операции поиска, сортировки и фильтрации будут дорогостоящими, поскольку DF - это неиндексированная распределенная структура данных.

Не зная разницы в скорости между Presto и Spark, не пробовал сравнивать.

Надеюсь, это поможет.

Примечание : Повышение производительности не гарантируется на локальном компьютере даже при оптимальной параллельной рабочей нагрузке. Не предоставляет возможности для распространения.

...