Spark jdbc. записать в MySQL с нулевой ошибкой - PullRequest
0 голосов
/ 05 июля 2018

Я создаю столбец в Dataframe, для которого задано значение NULL (через None), но при отправке в запись JDBC я получаю «Не удается получить тип JDBC для NULL». Любая помощь будет оценена.

update_func = (when(col("SN") != col("SNORIGINAL"), None)) 

aPACKAGEDF = aPACKAGEDF.withColumn('SNORIGINAL_TEMPCOL', update_func)

java.lang.IllegalArgumentException: невозможно получить тип JDBC для нуля в org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils $$ anonfun $ org $ apache $ spark $ sql $ выполнение $ источники данных $ jdbc $ JdbcUtils $$ getJdbcType $ 2.apply (JdbcUtils.scala 175): в org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils $$ anonfun $ org $ apache $ spark $ sql $ выполнение $ источники данных $ jdbc $ JdbcUtils $$ getJdbcType $ 2.apply (JdbcUtils.scala 175): в scala.Option.getOrElse (Option.scala: 121) в org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils $ .org $ apache $ spark $ sql $ исполнительный $ источники данных $ jdbc $ JdbcUtils $$ getJdbcType (JdbcUtils.scala: 174) в org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils $$ anonfun $ 20.apply (JdbcUtils.scala: 635) в org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils $$ anonfun $ 20.apply (JdbcUtils.scala: 635) на scala.collection.TraversableLike $$ anonfun $ map $ 1.apply (TraversableLike.scala: 234) на scala.collection.TraversableLike $$ anonfun $ map $ 1.apply (TraversableLike.scala: 234) в scala.collection.IndexedSeqOptimized $ class.foreach (IndexedSeqOptimized.scala: 33) в scala.collection.mutable.ArrayOps $ ofRef.foreach (ArrayOps.scala: 186) в scala.collection.TraversableLike $ class.map (TraversableLike.scala: 234) в scala.collection.mutable.ArrayOps $ ofRef.map (ArrayOps.scala: 186) в org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils $ .savePartition (JdbcUtils.scala: 635) в org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils $$ anonfun $ saveTable $ 1.apply (JdbcUtils.scala: 821) в org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils $$ anonfun $ saveTable $ 1.apply (JdbcUtils.scala: 821) в org.apache.spark.rdd.RDD $$ anonfun $ foreachPartition $ 1 $$ anonfun $ apply $ 29.apply (RDD.scala: 929) в org.apache.spark.rdd.RDD $$ anonfun $ foreachPartition $ 1 $$ anonfun $ apply $ 29.apply (RDD.scala: 929) в org.apache.spark.SparkContext $$ anonfun $ runJob $ 5.apply (SparkContext.scala: 2067) в org.apache.spark.SparkContext $$ anonfun $ runJob $ 5.apply (SparkContext.scala: 2067) в org.apache.spark.scheduler.ResultTask.runTask (ResultTask.scala: 87) в org.apache.spark.scheduler.Task.run (Task.scala: 109) в org.apache.spark.executor.Executor $ TaskRunner.run (Executor.scala: 345) в java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1149) в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:624) at java.lang.Thread.run (Thread.java:748)

1 Ответ

0 голосов
/ 05 июля 2018

Это потому, что None в

update_func = (when(col("SN") != col("SNORIGINAL"), None)) 

не имеет определенного типа. Вместо этого используйте литой литерал. Например, если тип должен быть строкой (VARCHAR или аналогичным):

from pyspark.sql.functions import lit

update_func = when(col("SN") != col("SNORIGINAL"), lit(None).cast("string")) 
...