Spark JDBC
JDBC является одним из самых распространённых источников данных в Spark. В этом разделе мы подробнее расскажем о том, как использовать официальный JDBC-коннектор ClickHouse в Spark.
Чтение данных
- Java
- Scala
- Python
Инициализация сессии Spark с JAR-файлами
spark = SparkSession.builder
.appName("example")
.master("local")
.config("spark.jars", ",".join(jar_files))
.getOrCreate()
url = "jdbc:ch://localhost:8123/default"
user = "your_user"
password = "your_password"
query = "select * from example_table where id > 2"
driver = "com.clickhouse.jdbc.ClickHouseDriver"
df = (spark.read .format('jdbc') .option('driver', driver) .option('url', url) .option('user', user) .option('password', password).option( 'query', query).load())
df.show()
Запись данных
- Java
- Scala
- Python
Инициализация Spark-сессии с JAR-файлами
spark = SparkSession.builder
.appName("example")
.master("local")
.config("spark.jars", ",".join(jar_files))
.getOrCreate()
Создание DataFrame
data = [Row(id=11, name="John"), Row(id=12, name="Doe")] df = spark.createDataFrame(data)
url = "jdbc:ch://localhost:8123/default"
user = "your_user"
password = "your_password"
driver = "com.clickhouse.jdbc.ClickHouseDriver"
Запись DataFrame в ClickHouse
df.write
.format("jdbc")
.option("driver", driver)
.option("url", url)
.option("user", user)
.option("password", password)
.option("dbtable", "example_table")
.mode("append")
.save()
Параллелизм
При использовании Spark JDBC Spark читает данные, используя один раздел (partition). Чтобы добиться более высокой степени параллелизма, необходимо указать
partitionColumn, lowerBound, upperBound и numPartitions, которые определяют, как разбивать таблицу на разделы при
параллельном чтении несколькими исполнителями (workers).
Дополнительную информацию см. в официальной документации Apache Spark
по параметрам JDBC.
Ограничения JDBC
- На данный момент с помощью JDBC можно вставлять данные только в уже существующие таблицы (нет возможности автоматически создавать таблицу при вставке DataFrame, как это делает Spark с другими подключениями).