PYTHON:有没有办法在Redshift的SUPER列中插入JSON而不使用转义字符?

ifsvaxew  于 2022-12-15  发布在  Python
关注(0)|答案(1)|浏览(169)

我尝试将从API返回的数据保存为JSON,保存在Redshift上一个表的SUPER类型列中。
我的要求:

data = requests.get(url=f'https://economia.awesomeapi.com.br/json/last/USD-BRL'

我有一个插入数据的函数,运行如下:

QUERY = f"""INSERT INTO {schema}.{table}(data) VALUES (%s)"""

    conn = self.__get_conn()
    cursor = conn.cursor()

    print('INSERT DATA')
    cursor.execute(query=QUERY, vars=([data, ]))
    conn.commit()

当尝试使用data.json()插入数据时,我得到以下错误:所以我使用json.dumps(data.json())来序列化和输入它。
但是当我查看数据库时,数据包含如下转义字符:"{\"code\": \"USD\", \"codein\": \"BRL\", \"name\": \"Dólar Americano/Real Brasileiro\", \"high\": \"5.2768\", \"low\": \"5.1848\", \"varBid\": \"-0.0264\", \"pctChange\": \"-0.5\", \"bid\":
我想使用DBT来构造这个数据集,使用JSON_PARSE()和红移上的CTE,但是这些转义字符挡住了我的路。
我错过了什么?有别的方法吗?
表DDL:

CREATE TABLE IF NOT EXISTS public.raw_currency
(
    id BIGINT  DEFAULT "identity"(105800, 0, '1,1'::text) ENCODE az64
    ,"data" SUPER   ENCODE zstd
    ,stored_at TIMESTAMP WITHOUT TIME ZONE   ENCODE az64
    ,error_log VARCHAR(65535)   ENCODE lzo
)
eh57zj3b

eh57zj3b1#

INSERT是具有红移的反模式;基本上,插入是非常慢的。2在这个例子中,是JSON和字符串的相互转换让你感觉到了什么。
在大容量插入数据时,您需要使用COPY。Redshift的COPY带有一个format参数,JSON是许多受支持的格式之一。
请注意,要被复制,数据需要在S3中,并且您的红移集群需要访问您正在复制的S3中的键。

相关问题