Spark SQL записывает DF в таблицу Teradata, используя режим перезаписи, удаляет таблицу, хотя truncate имеет значение True - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь записать записи DF в таблицу Teradata, используя Spark JDBC.

Пример кода:

df.write.format("jdbc")\
        .option("url", jdbcUrl)\
        .option("driver", "com.teradata.jdbc.TeraDriver") \
        .option("dbtable", dbTableName) \
        .option("user", userName)\
        .option("password", passWord) \
        .option("numPartitions", 3) \
        .option("truncate", True) \
        .mode('overwrite')\
        .save()

Это всегда отбрасывать таблицу исоздайте таблицу снова.Когда он снова создает таблицу, он создает таблицу как таблицу SET вместо таблицы MULTISET.

Согласно документации Spark, когда я передаю truncate как True, он должен обрезать таблицу вместо удаления таблицы.

Это опция, связанная с JDBC-писателем.Когда SaveMode.Overwrite включен, эта опция заставляет Spark обрезать существующую таблицу вместо ее удаления и повторного создания.Это может быть более эффективным и предотвращает удаление метаданных таблицы (например, индексов).Однако в некоторых случаях это не будет работать, например, когда новые данные имеют другую схему.По умолчанию используется значение false.Эта опция применима только к письму.

1 Ответ

0 голосов
/ 19 сентября 2018

Таблица мультимножеств по умолчанию может быть создана в режиме ANSI

. Вы можете указать режим teradata с TMODE = ANSI в качестве параметра в URL JDBC

val jdbcUrl = jdbc:teradata://TDHOST/database=databasename,TMODE=ANSI

df.write.format("jdbc")\
        .option("url", jdbcUrl)\
        .option("driver", "com.teradata.jdbc.TeraDriver") \
        .option("dbtable", dbTableName) \
        .option("user", userName)\
        .option("password", passWord) \
        .option("numPartitions", 3) \
        .option("truncate", True) \
        .mode('overwrite')\
        .save()
...