Обновление: и моя версия, и версия Фреда Алиссона отлично работают на новом кластере. Это была проблема с моей стороны конфигурация диалекта.
Я пытался запросить SQL-сервер с помощью искры, но не могу заставить его отобразить полученный фрейм данных, поскольку искра отправляет на SQL-сервер буквальный «LIMIT», что приводит к SQLServerException
.
Следующий запрос работает абсолютно нормально
df = spark.read.format('sqlserver') \
.option('host', sql_server_host) \
.option('port', sql_server_port) \
.option('database', sql_server_database) \
.option('user', sql_server_user) \
.option('password', sql_server_password) \
.option("dbtable", 'dbo.TestTable')
.load()
но при беге
df.display() or display(df)
Я получаю следующую ошибку:
SQLServerException: неправильный синтаксис рядом с «10001».
При дальнейшей проверке я вижу, что искра отправляет следующий запрос на сервер sql, который явно терпит неудачу, поскольку SQL Server не поддерживает LIMIT.
SELECT TestColumn FROM dbo.TestTable LIMIT 10001
Что-то не так с моей конфигурацией и есть ли обходной путь?
не так ли: .format("com.microsoft.sqlserver.jdbc.spark")
Не могли бы вы вместо этого использовать df.show()
? По умолчанию этот метод отображает 20 строк. Также можно указать количество строк, которые вы хотите показать, используя df.show(100)
, или показать все строки, выполнив df.show(df.count())
.
Похоже на ошибку в включенном драйвере SQL Server. Это все равно произойдет, если вы вместо этого используете spark.read.format("jdbc").option("driver", "jdbc:sqlserver://...")...
?
@siggemannen, да, нет. Я работал над документацией databricks, где говорилось, что вы можете использовать .format("sqlserver")
. Видимо, это более экспериментально, чем я ожидал.
@smurphy не работает, поскольку он все равно отправит это ограничение на сервер sql.
@user3657850 user3657850 Меня удивляет то, насколько плохи все эти искровые документы! Они очень редки, и большинство из них повторяют названия параметров/методов.
По умолчанию Spark использует «LIMIT» (SQL Server — «TOP»). То, что вы можете попробовать:
1 – Чтение с использованием соединения JDBC
2. Укажите таблицу с помощью специального запроса.
Пример кода для первого варианта:
df = spark.read.format('jdbc') \
.option('url', f'jdbc:sqlserver://{sql_server_host}:{sql_server_port};databaseName = {sql_server_database}') \
.option('dbtable', 'dbo.TestTable') \
.option('user', sql_server_user) \
.option('password', sql_server_password) \
.option('driver', 'com.microsoft.sqlserver.jdbc.SQLServerDriver') \
.load()
Пример кода для второго варианта:
query = "(SELECT * FROM dbo.TestTable) AS TestTable"
df = spark.read.format('jdbc') \
.option('url', f'jdbc:sqlserver://{sql_server_host}:{sql_server_port};databaseName = {sql_server_database}') \
.option('query', query) \
.option('user', sql_server_user) \
.option('password', sql_server_password) \
.option('driver', 'com.microsoft.sqlserver.jdbc.SQLServerDriver') \
.load()
Попробуйте эти способы и дайте мне знать, если вам понадобится дополнительная помощь!
У меня такая же проблема при использовании этих опций...
Даже если вы используете явный запрос? Попробуйте использовать SELECT TOP 10000 * FROM your_table и отправьте сюда распечатку проблемы, чтобы я мог увидеть ошибку.
Ага. Он будет добавлен к каждой команде, которая ограничивает вывод. show(), display(),... Но по мере того, как я изучал эту проблему, проблема как-то связана с пользовательским диалектом, который мы используем для преобразования TimestampType в datetime2 для сервера sql. В предыдущей версии LTS работало нормально, но в 14.3 почему-то не работает. Все еще изучаю это.
Запуск Spark 3.5.0 на блоках данных 14.3 LTS