Spark SQL -проблемы с сохранением DataFrame в базу данных через JDBC - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть таблица test, зарегистрированная с DataFrame с использованием registerTempTable.

И я запрашиваю таблицу test:

df = sqlContext.sql("select no,vipgroupname,sum(name) as count from test group by no,vipgroupname limit 5")

Ниже приведен результат:

df.show()
+---+---------------+----------------------------+
|no |   vipgroupname|                count       |
+---+---------------+----------------------------+
| 1 |       testa   |                         636|
| 2 |       testb   |                         28 |
| 3 |       testc   |                         21 |
| 4 |       testd   |                         142|
| 5 |       teste   |                         79 |
+---+---------------+----------------------------+

Попробуйте сохранить его как таблицу test во внешней базе данных(Sybase в данном случае)



    properties = {
        "user": "test",
        "password": "Test123!"
    }
    url = "jdbc:sybase:Tds:9.16.18.30:5566?ServiceName=test"
    df.write.mode('overwrite').jdbc(url=url, table="test",properties=properties

)

Это действие было выполнено правильно, и все данные были сохранены в Sybase в таблице test.Но когда я выполнил это снова, чтобы проверить поведение перезаписи.

df.write.mode('overwrite').jdbc(url=url, table="test",properties=properties)

Все, что я получил, было исключением:



    Py4JJavaError: An error occurred while calling o547.jdbc.
     java.sql.SQLException: SQL Anywhere Error -110: Item 'test' already exists
        at com.sybase.jdbc4.jdbc.SybConnection.getAllExceptions(SybConnection.java:2780)
        at com.sybase.jdbc4.jdbc.SybStatement.handleSQLE(SybStatement.java:2665)
        at com.sybase.jdbc4.jdbc.SybStatement.nextResult(SybStatement.java:295)
        at com.sybase.jdbc4.jdbc.SybStatement.nextResult(SybStatement.java:272)
        at com.sybase.jdbc4.jdbc.SybStatement.updateLoop(SybStatement.java:2515)
        at com.sybase.jdbc4.jdbc.SybStatement.executeUpdate(SybStatement.java:2499)
        at com.sybase.jdbc4.jdbc.SybPreparedStatement.executeUpdate(SybPreparedStatement.java:297)
        at org.apache.spark.sql.DataFrameWriter.jdbc(DataFrameWriter.scala:370)
        at sun.reflect.GeneratedMethodAccessor95.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:231)
        at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:379)
        at py4j.Gateway.invoke(Gateway.java:259)
        at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:133)
        at py4j.commands.CallCommand.execute(CallCommand.java:79)
        at py4j.GatewayConnection.run(GatewayConnection.java:207)
        at java.lang.Thread.run(Thread.java:745)

  

Я думал, что режим overwrite удалит текущую таблицу и создаст новую таблицу.Но это исключение, похоже, не так.И исключение также пришло с режимом append.

Я использую Jupyter Notebook (установленный Anaconda 5.3.1) для запуска вышеуказанного кода, а версия Spark 1.5.1.

Я что-то здесь не так?

Спасибо!

...