Запись кадра данных с помощью запроса sql (pyodb c): pyodb c .Error: ('HY004', '[HY004]) - PullRequest
0 голосов
/ 16 марта 2020

Я бы хотел проанализировать фрейм данных для двух предварительно определенных столбцов в таблице sql. Схема в sql выглядит следующим образом:

abc(varchar(255))
def(varchar(255))

С таким фреймом данных:

df = pd.DataFrame(
    [
        [False, False],
        [True, True],

    ],
    columns=["ABC", "DEF"],
)

И запрос sql выглядит так:

with conn.cursor() as cursor:
    string = "INSERT INTO {0}.{1}(abc, def) VALUES (?,?)".format(db, table)
    cursor.execute(string, (df["ABC"]), (df["DEF"]))
    cursor.commit()

Чтобы запрос (строка) выглядел следующим образом:

'INSERT INTO my_table(abc, def) VALUES (?,?)'

Это создает следующее сообщение об ошибке:

pyodbc.Error: ('HY004', '[HY004] [Cloudera][ODBC] (11320) SQL type not supported. (11320) (SQLBindParameter)')

Поэтому я пытаюсь использовать прямой запрос (не через Python ) в редакторе Impala:

'INSERT INTO my_table(abc, def) VALUES ('Hey','Hi');'

И выдает это сообщение об ошибке:

AnalysisException: Possible loss of precision for target table 'my_table'. Expression ''hey'' (type: `STRING) would need to be cast to VARCHAR(255) for column 'abc'`

Почему я даже не могу вставить в свою таблицу простые строки, такие как «Привет» ? Правильно ли настроена моя схема или что-то еще?

1 Ответ

1 голос
/ 16 марта 2020

STRING тип в Impala имеет ограничение размера 2 ГБ. Длина VARCHAR - это то, что вы определяете, но не более 64 КБ. Таким образом, существует вероятность потери данных, если вы неявно конвертируете одно в другое.

По умолчанию литералы обрабатываются как тип STRING. Таким образом, чтобы вставить литерал в поле VARCHAR, необходимо CAST его соответствующим образом.

INSERT INTO my_table(abc, def) VALUES (CAST('Hey' AS VARCHAR(255)),CAST('Hi' AS VARCHAR(255)));
...