Использование JDBC в Apache Spark для подключения к MS SQL Server 2008 R2 [дубликат]

Эрик,

Вы задаете себе неправильный вопрос. Если ваш скрипт исполняется в ~ 15 мсек, тогда его время в значительной степени не имеет значения. Если вы запускаете совместную службу, тогда активация изображения PHP займет ~ 100 мсек, чтение в файлах сценариев ~ 30-50 мсек при полной кешировании на сервере, возможно, 1 или более секунд при загрузке с фермы NAS на сервере. Задержки сети при загрузке мебели страницы могут добавить много секунд.

Основной проблемой здесь является восприятие пользователями времени загрузки: сколько времени он или она должен ждать между нажатием на ссылку и получением полностью отображаемой страницы. Посмотрите страницу Google Page Speed ​​, которую вы можете использовать как расширение Ff или chrome, и документацию Pagespeed, в которой подробно обсуждается, как добиться хорошей производительности страницы. Следуйте этим рекомендациям и постарайтесь улучшить показатели своей страницы, чем 90/100. (Главная страница google оценивает 99/100, как и мой блог). Это лучший способ получить хорошую пользовательскую производительность.

31
задан zero323 13 March 2016 в 14:08
поделиться

3 ответа

Запись данных

  1. Включите применимый драйвер JDBC при отправке приложения или запуске оболочки. Вы можете использовать, например, --packages:
    bin/pyspark --packages group:name:version  
    
    или комбинировать driver-class-path и jars
    bin/pyspark --driver-class-path $PATH_TO_DRIVER_JAR --jars $PATH_TO_DRIVER_JAR
    
    Эти свойства также могут быть установлены с использованием переменной среды PYSPARK_SUBMIT_ARGS до запуска экземпляра JVM или с помощью conf/spark-defaults.conf для установки spark.jars.packages или spark.jars / spark.driver.extraClassPath.
  2. Выберите нужный режим. Писатель Spark JDBC поддерживает следующие режимы: append: добавить содержимое этого: class: DataFrame к существующим данным. overwrite: Перезаписать существующие данные. ignore: тихо игнорируйте эту операцию, если данные уже существуют. error (случай по умолчанию): выдать исключение, если данные уже существуют. Усиления или другие мелкозернистые модификации не поддерживаются
    mode = ...
    
  3. Подготовить URI JDBC, например:
    # You can encode credentials in URI or pass
    # separately using properties argument
    # of jdbc method or options
    
    url = "jdbc:postgresql://localhost/foobar"
    
  4. (Необязательно) Создать словарь аргументов JDBC.
    properties = {
        "user": "foo",
        "password": "bar"
    }
    
  5. Для сохранения данных используйте DataFrame.write.jdbc
    df.write.jdbc(url=url, table="baz", mode=mode, properties=properties)
    
    (подробнее см. pyspark.sql.DataFrameWriter ).

Известные проблемы :

  • Подходящий драйвер не может быть найден, если драйвер был включен с использованием --packages (java.sql.SQLException: No suitable driver found for jdbc: ...) Предполагая, что для решения проблемы нет несоответствия версии драйвера, вы можете добавить класс driver в properties. Например:
    properties = {
        ...
        "driver": "org.postgresql.Driver"
    }
    
  • с помощью df.write.format("jdbc").options(...).save() может привести к: java.lang.RuntimeException: org.apache.spark.sql.execution.datasources.jdbc.DefaultSource не позволяет создавать таблицу как выбранную. Решение неизвестно.
  • в Pyspark 1.3 вы можете попробовать напрямую вызвать метод Java:
    df._jdf.insertIntoJDBC(url, "baz", True)
    

Чтение данных

  1. Выполните шаги 1 -4 из Запись данных
  2. Используйте sqlContext.read.jdbc:
    sqlContext.read.jdbc(url=url, table="baz", properties=properties)
    
    или sqlContext.read.format("jdbc"):
    (sqlContext.read.format("jdbc")
        .options(url=url, dbtable="baz", **properties)
        .load())
    

Известные проблемы и gotchas :

  • Подходящий драйвер не может быть найден - см .: Запись данных
  • Spark SQL поддерживает перенаправление предикатов с источниками JDBC, хотя не все предикаты могут быть сдвинуты вниз. Он также не делегирует ограничения и агрегаты. Возможным обходным решением является замена аргумента dbtable / table действительным подзапросом. См. Например: Работает ли искривление предиката с JDBC? Более одного часа для выполнения pyspark.sql.DataFrame.take (4)
  • By по умолчанию источники данных JDBC загружают данные последовательно, используя один поток исполнителей. Для обеспечения распределенной загрузки данных вы можете: Предоставить разделение column (должно быть IntegeType), lowerBound, upperBound, numPartitions. Предоставьте список взаимоисключающих предикатов predicates, по одному для каждого требуемого раздела.
  • В распределенном режиме (с разделительным столбцом или предикатами) каждый исполнитель работает в своей собственной транзакции. Если исходная база данных изменяется одновременно, нет гарантии, что окончательный вид будет согласован.

Где найти подходящие драйверы:

64
ответ дан Community 15 August 2018 в 15:38
поделиться

Отправьте эту ссылку, чтобы загрузить jdbc для postgres и следуйте инструкциям по загрузке jar-файла

https://jaceklaskowski.gitbooks.io/mastering-apache-spark/exercises/spark- Файл-файл-файл-dataframe-jdbc-postgresql.html будет загружен на пути, подобном этому. "/home/anand/.ivy2/jars/org.postgresql_postgresql-42.1.1.jar"

Если ваша искробезопасная версия 2

from pyspark.sql import SparkSession

spark = SparkSession.builder
        .appName("sparkanalysis")
        .config("spark.driver.extraClassPath",
         "/home/anand/.ivy2/jars/org.postgresql_postgresql42.1.1.jar")
        .getOrCreate()

//for localhost database//

pgDF = spark.read \
.format("jdbc") \
.option("url", "jdbc:postgresql:postgres") \
.option("dbtable", "public.user_emp_tab") \
.option("user", "postgres") \
.option("password", "Jonsnow@100") \
.load()


print(pgDF)

pgDF.filter(pgDF["user_id"]>5).show()

сохранит файл как питон и запустите «python соответствующееfilename.py»

-2
ответ дан anand ml 15 August 2018 в 15:38
поделиться

Загрузите драйвер mysql-connector-java и сохраните в папке с искровым jar, обратите внимание на приведенный ниже код python, записывая данные в «acotr1», мы должны создать структуру таблицы acotr1 в базе данных mysql

spark = SparkSession .builder.appName ( "прасадад") мастер ( 'локального') конфигурации ( 'spark.driver.extraClassPath', '. D:. \ искрового 2.1.0-бен-hadoop2.7 \ баночка \ MySQL-разъем-Java -5.1.41-bin.jar '). GetOrCreate ()

sc = spark.sparkContext

из pyspark.sql import SQLContext

sqlContext = SQLContext ( sc)

df = sqlContext.read.format ("jdbc") .options (url = "jdbc: mysql: // localhost: 3306 / sakila", driver = "com.mysql.jdbc.Driver ", dbtable =" actor ", user =" root ", password =" Ramyam01 "). load ()

mysql_url =" jdbc: mysql: // localhost: 3306 / sakila? user = root & amp; password = Ramyam01 "

df.write.jdbc (mysql_url, table =" actor1 ", mode =" append ")

-1
ответ дан y durga prasad 15 August 2018 в 15:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: