У меня есть таблица 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
.
Я что-то здесь не так?
Спасибо!