выполнить запрос на sqlserver, используя искру sql

Я пытаюсь получить количество строк и столбцов всех таблиц в схеме на сервере sql, используя искру sql.

когда я выполняю запрос ниже с помощью sqoop, он дает мне правильные результаты.

sqoop eval --connect "jdbc:sqlserver://<hostname>;database=<dbname>" \
--username=<username> --password=<pwd> \
--query """SELECT 
ta.name TableName ,
pa.rows RowCnt, 
COUNT(ins.COLUMN_NAME) ColCnt FROM <db>.sys.tables ta INNER JOIN 
<db>.sys.partitions pa ON pa.OBJECT_ID = ta.OBJECT_ID INNER JOIN 
<db>.sys.schemas sc ON ta.schema_id = sc.schema_id join 
<db>.INFORMATION_SCHEMA.COLUMNS ins on ins.TABLE_SCHEMA =sc.name and ins.TABLE_NAME=ta.name 
WHERE ta.is_ms_shipped = 0 AND pa.index_id IN (1,0) and sc.name ='<schema>' GROUP BY sc.name, ta.name, pa.rows order by 
TableName"""

Но когда я пытаюсь выполнить тот же запрос из spark sql, я получаю сообщение об ошибке: "com.microsoft.sqlserver.jdbc.SQLServerException: неправильный синтаксис рядом с ключевым словом 'WHERE'" Пожалуйста, помогите мне , если кто знает об этой ошибке.

Ниже приведена команда spark sql, которую я выполнил spark-shell --jars "/var/lib/sqoop/sqljdbc42.jar"

sqlContext.read.format("jdbc").option("url", "jdbc:sqlserver://<hostname>;database=<dbname>;user=<user>;password=<pwd>").option("dbtable", """(SELECT 
ta.name TableName ,pa.rows RowCnt, 
COUNT(ins.COLUMN_NAME) ColCnt FROM <db>.sys.tables ta INNER JOIN 
<db>.sys.partitions pa ON pa.OBJECT_ID = ta.OBJECT_ID INNER JOIN 
<db>.sys.schemas sc ON ta.schema_id = sc.schema_id join 
<db>.INFORMATION_SCHEMA.COLUMNS ins on ins.TABLE_SCHEMA =sc.name and ins.TABLE_NAME=ta.name 
WHERE ta.is_ms_shipped = 0 AND pa.index_id IN (1,0) and sc.name ='<schema>' GROUP BY sc.name,ta.name, pa.rows)""").option("driver", "com.microsoft.sqlserver.jdbc.SQLServerDriver").load()

ожидаемый результат:

TableName, RowCnt, ColCnt

таблица A, 62, 30

таблица B, 3846, 76


person Mounika    schedule 24.09.2018    source источник
comment
Кажется, вам не хватает одинарных или двойных кавычек перед оператором Select? Вы пробовали это?   -  person CR241    schedule 25.09.2018


Ответы (1)


Проблема в вашей команде Spark SQL связана с параметром dbTable.

dbTable принимает все, что допустимо в предложении FROM запроса SQL. Например, вместо полной таблицы вы также можете использовать подзапрос в круглых скобках. Однако при использовании подзапросов в круглых скобках у него должен быть псевдоним. Таким образом, ваша команда должна быть изменена как,

sqlContext
.read
.format("jdbc")
.option("url", "jdbc:sqlserver://<hostname>;database=<dbname>;user=<user>;password=<pwd>")
.option("dbtable", 
    """(SELECT 
    ta.name TableName ,
    pa.rows RowCnt, 
    COUNT(ins.COLUMN_NAME) ColCnt 
    FROM <db>.sys.tables ta 
    INNER JOIN 
    <db>.sys.partitions pa 
    ON pa.OBJECT_ID = ta.OBJECT_ID 
    INNER JOIN 
    <db>.sys.schemas sc 
    ON ta.schema_id = sc.schema_id 
    JOIN 
    <db>.INFORMATION_SCHEMA.COLUMNS ins 
    ON ins.TABLE_SCHEMA = sc.name and ins.TABLE_NAME = ta.name 
    WHERE ta.is_ms_shipped = 0 
     AND pa.index_id IN (1,0) 
     AND sc.name ='<schema>' 
    GROUP BY sc.name,ta.name, pa.rows) as TEMP""")
.option("driver", "com.microsoft.sqlserver.jdbc.SQLServerDriver")
.load()

Просто догадка. Надеюсь это поможет!

person suj1th    schedule 25.09.2018