Как записать исходный код JDBC с помощью SparkR 1.6.0?

С помощью SparkR 1.6.0 я могу читать из источника JDBC следующий код:

jdbc_url <- "jdbc:mysql://localhost:3306/dashboard?user=<username>&password=<password>"

df <- sqlContext %>%
  loadDF(source     = "jdbc", 
         url        = jdbc_url, 
         driver     = "com.mysql.jdbc.Driver",
         dbtable    = "db.table_name")

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

write.df(df      = df,
         path    = "NULL",
         source  = "jdbc",
         url     = jdbc_url, 
         driver  = "com.mysql.jdbc.Driver",
         dbtable = "db.table_name",
         mode    = "append")

...возвращается...

ERROR RBackendHandler: save on 55 failed
Error in invokeJava(isStatic = FALSE, objId$id, methodName, ...) : 
  java.lang.RuntimeException: org.apache.spark.sql.execution.datasources.jdbc.DefaultSource does not allow create table as select.
    at scala.sys.package$.error(package.scala:27)
    at org.apache.spark.sql.execution.datasources.ResolvedDataSource$.apply(ResolvedDataSource.scala:259)
    at org.apache.spark.sql.DataFrameWriter.save(DataFrameWriter.scala:148)
    at org.apache.spark.sql.DataFrame.save(DataFrame.scala:2066)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.spark.api.r.RBackendHandler.handleMethodCall(RBackendHandler.scala:141)
    at org.apache.spark.api.r.RBackendHandler.channelRead0(RBackendHandler.scala:86)
    at org.apache.spark.api.r.RBackendHandler.channelRead0(RBackendHandler.scala:38)
    at io.netty.channel.SimpleChannelIn

Просматривая Интернет, я нашел это, что говорит мне о том, что патч для этой ошибки был включен начиная с версии 2.0.0; а также получаем функции read.jdbc и write.jdbc.

Однако для этого вопроса предположим, что я застрял на SparkR v1.6.0. Есть ли способ записи в исходники JDBC (т.е. есть ли обходной путь, который позволил бы мне использовать DataFrameWriter.jdbc() из SparkR)?


person Jake Russ    schedule 16.08.2017    source источник
comment
Похоже, что нет. Версия у вас явно не умеет писать. Если вы не можете добавить патч для исправления, вы застряли.   -  person duffymo    schedule 16.08.2017
comment
Я думал, что это, возможно, был ответ, но я хотел, чтобы я все равно спросил о обходном пути. Я все еще новичок в SparkR, и для этой ситуации может быть что-то доступное, чего нет в документации. Я приму ответ «Нет» здесь, если получу окончательный ответ.   -  person Jake Russ    schedule 16.08.2017
comment
Что мешает обновиться? Разве это не должно быть просто обновление пакета R?   -  person duffymo    schedule 16.08.2017
comment
Я застрял в использовании Spark v1.6.0 в своей компании, потому что это производственная среда, которую мы используем, пока не сможем обновить ее до Spark 2.x.x. Но ваш комментарий полезен, потому что он заставляет меня понять, что я не могу застрять с SparkR 1.6.0, даже если я использую Spark 1.6.0. Я собираюсь попробовать установить SparkR 2.0.0 через Github + devtools и посмотреть, будет ли новый SparkR работать со старым Spark.   -  person Jake Russ    schedule 16.08.2017
comment
Правильно, запись выполняется подключаемым модулем. Вы можете свободно обновлять его, не изменяя установку вашего сервера.   -  person duffymo    schedule 16.08.2017
comment
Это была хорошая мысль, но оказалось, что это не работает. Между Spark 1.6.x и 2.0.0 должны быть критические изменения. I SparkR 2.0.0 будет установлен на машину, но ни одна из функций чтения/записи не работает.   -  person Jake Russ    schedule 16.08.2017
comment
Мне очень жаль. Можете ли вы экспортировать результаты R в .csv и написать Java, чтобы сохранить это?   -  person duffymo    schedule 16.08.2017
comment
Давайте продолжим обсуждение в чате.   -  person Jake Russ    schedule 16.08.2017


Ответы (1)


Короткий ответ: нет, метод записи JDBC не поддерживался SparkR до версии 2.0.0.

person Jake Russ    schedule 17.08.2017