【问题标题】:Redshift COPY command - values for some fields did not copy acrossRedshift COPY 命令 - 某些字段的值未复制
【发布时间】:2020-04-26 06:47:06
【问题描述】:

我创建了一个临时表,我想使用 COPY 命令从 S3 存储桶中的 JSON 文件填充该表。它有效,但 firstNameitemInSessionlastNamesessionIduserAgentuserId 的值没有被复制。

table.py

from dwh_conn import *

drop_staging_event = "DROP TABLE IF EXISTS staging_event;"

create_staging_event = ("""
CREATE TABLE IF NOT EXISTS staging_event(
    artist VARCHAR,
    auth VARCHAR,
    firstName VARCHAR,
    gender TEXT,
    itemInSession INTEGER,
    lastName VARCHAR,
    length FLOAT,
    level TEXT,
    location VARCHAR,
    method TEXT,
    page TEXT,
    registration FLOAT,
    sessionId INTEGER,
    song VARCHAR,
    status INTEGER,
    ts BIGINT,
    userAgent VARCHAR,
    userId VARCHAR
    );""")

load_staging_event = ("""COPY staging_event FROM 's3://dwh-training/data/log_data/2018/11/'
    credentials 'aws_iam_role={}' region 'us-east-2' JSON 'auto';""").format(ROLE_ARN)

以下返回空行:

SELECT firstName, itemInSession, lastName, sessionId, userAgent, userId FROM staging_event LIMIT 5;
 firstname | iteminsession | lastname | sessionid | useragent | userid 
-----------+---------------+----------+-----------+-----------+--------
           |               |          |           |           | 
           |               |          |           |           | 
           |               |          |           |           | 
           |               |          |           |           | 
           |               |          |           |           | 
(5 rows)

但其他字段有值:

SELECT artist, auth, gender, length, level, location, method, page, registration, song, status, ts FROM staging_event LIMIT 5;
          artist           |   auth    | gender |  length   | level |         location         | method |   page   | registration  |              song               | status |      ts       
---------------------------+-----------+--------+-----------+-------+--------------------------+--------+----------+---------------+---------------------------------+--------+---------------
 N.E.R.D. FEATURING MALICE | Logged In | M      |  288.9922 | free  | New Orleans-Metairie, LA | PUT    | NextSong | 1541033612796 | Am I High (Feat. Malice)        |    200 | 1541121934796
                           | Logged In | F      |           | free  | Lubbock, TX              | GET    | Home     | 1540708070796 |                                 |    200 | 1541122176796
 Death Cab for Cutie       | Logged In | F      | 216.42404 | free  | Lubbock, TX              | PUT    | NextSong | 1540708070796 | A Lack Of Color (Album Version) |    200 | 1541122241796
 Tracy Gang Pussy          | Logged In | F      | 221.33506 | free  | Lubbock, TX              | PUT    | NextSong | 1540708070796 | I Have A Wish                   |    200 | 1541122457796
 Skillet                   | Logged In | M      | 178.02404 | free  | Harrisburg-Carlisle, PA  | PUT    | NextSong | 1540006905796 | Monster (Album Version)         |    200 | 1541126568796
(5 rows)

有谁知道为什么没有填充空字段?谢谢。

【问题讨论】:

    标签: python postgresql amazon-redshift


    【解决方案1】:

    Banty - 带有“json 'auto'”的 Redshift COPY 只会加载它可以与表匹配的 json 值。这可以在与顶级 json 键匹配的列名上完成,但它们需要完全匹配。检查这些名称是否完全匹配。

    更好的匹配方式是使用 json_paths 文件,该文件将 json 键映射到 Redshift 列。可以在那里进行名称更改以及从非顶级 json 键加载数据。

    这只是我所知道的发生这种情况的最常见原因。如果您需要更多信息回复,并且您可能需要提供您正在加载的 json 之外的内容。

    【讨论】:

    • 感谢您的回复。在发布问题之前,我检查了列名是否与顶部的 json 键匹配但不起作用。正如您所指出的,使用 json 路径文件进行映射可以解决问题。
    猜你喜欢
    • 2014-03-18
    • 2022-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-01
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多