Попытка записи Pu sh из кадра данных в таблицу серверов SQL - PullRequest
0 голосов
/ 06 февраля 2020

Я пытаюсь найти способ поместить все sh из таблицы данных в SQL таблицу сервера. Я сделал небольшое гугление и придумал это.

Cluster.write \
    .format("jdbc") \
    .option("url", "jdbc:sqlserver://name_here.database.windows.net:1433;databaseName=db_name") \
    .option("dbtable", "dbo.Cluster") \
    .option("user", "u_name") \
    .option("password", "p_wd") \
    .save()

Мой фрейм данных называется Cluster и имеет тип pyspark. sql .dataframe.DataFrame. Если таблица существует в БД, когда я запускаю приведенный выше код, я получаю это сообщение об ошибке:

org.apache.spark.sql.AnalysisException: Table or view 'dbo.Cluster' already exists. SaveMode: ErrorIfExists.;

Если я удаляю таблицу и запускаю приведенный выше код, я получаю это сообщение об ошибке:

java.lang.IllegalArgumentException: Can't get JDBC type for struct<type:tinyint,size:int,indices:array<int>,values:array<double>>

Это должно быть выполнимо. Я делал это раньше в среде Spark; этот код работал отлично. Сейчас я работаю в среде Python (используя Databricks), и я застрял в этом на одном.

Просто чтобы пройти полный круг, я создаю фрейм данных следующим образом:

df = spark.read \

.jdbc("jdbc:sqlserver://name_here.database.windows.net:1433;databaseName=db_name", "dbo.table_name",
              properties={"user": "u_name", "password": "p_wd"})

Тогда ... Я делаю аналитику и данные ... в конце концов, я применяю некоторые алгоритмы ML к данным ... и создаю два кадра данных.

df1 = df1.select("*").toPandas()
df2 = df2("*").toPandas()

Теперь Мне нужно объединить эти два кадра данных вместе.

Cluster = pd.concat([df1, df2], axis=1)

Наконец, я хочу поместить sh этот кадр данных в таблицу SQL Server. Все работает совершенно нормально, пока я в конце концов не попытаюсь поместить все данные из таблицы данных в таблицу. Это единственная проблема, которую я имею здесь.

1 Ответ

0 голосов
/ 07 февраля 2020

Вы можете попробовать использовать другой SaveMode. Для добавления данных добавьте:

Cluster.write \
    .format("jdbc") \
    .option("url", "jdbc:sqlserver://name_here.database.windows.net:1433;databaseName=db_name") \
    .option("dbtable", "dbo.Cluster") \
    .option("user", "u_name") \
    .option("password", "p_wd") \
    .mode("append") \
    .save()

или Перезаписать, чтобы заменить данные:

Cluster.write \
    .format("jdbc") \
    .option("url", "jdbc:sqlserver://name_here.database.windows.net:1433;databaseName=db_name") \
    .option("dbtable", "dbo.Cluster") \
    .option("user", "u_name") \
    .option("password", "p_wd") \
    .mode("overwrite") \
    .save()

Источник

...