解析复制命令 Snowflake 中 xml 的 JSON 异常时出错
Error parsing JSON exception for xml filed in copy command Snowflake
您好,我已经声明了一个 table 这样的
create or replace table app_event (
ID varchar(36) not null primary key,
VERSION number,
ACT_TYPE varchar(255),
EVE_TYPE varchar(255),
CLI_ID varchar(36),
DETAILS variant,
OBJ_TYPE varchar(255),
DATE_TIME timestamp,
AAPP_EVENT_TO_UTC_DT timestamp,
GRO_ID varchar(36),
OBJECT_NAME varchar(255),
OBJ_ID varchar(255),
USER_NAME varchar(255),
USER_ID varchar(255),
EVENT_ID varchar(255),
FINDINGS varchar(255),
SUMMARY variant
);
DETAILS 列将包含 xml 文件,以便我可以 运行 xml 函数并获取该 xml 文件的元素。
我的示例行如下所示
dfjkghdfkjghdf8gd7f7997,0,TEST_CASE,CHECK,74356476476DFD,<?xml version="1.0" encoding="UTF-8"?><testPayload><testId>3495864795uiyiu</testId><testCode>COMPLETED</testCode><testState>ONGOING</testState><noOfNewTest>1</noOfNewTest><noOfReviewRequiredTest>0</noOfReviewRequiredTest><noOfExcludedTest>0</noOfExcludedTest><noOfAutoResolvedTest>1</noOfAutoResolvedTest><testerTypes>WATCHLIST</testerTypes></testPayload>,CASE,41:31.3,NULL,948794853948dgjd,(null),dfjkghdfkjghdf8gd7f7997,test user,dfjkghdfkjghdf8gd7f7997,NULL,(null),(null)
当我将 DETAILS
声明为 varchar
时,我能够加载文件,但是当我将其声明为 variant
时,我仅在该列中出现错误
Error parsing JSON:
dfjkghdfkjghdf8gd7f7997COMPLETED</status
File 'SNOWFLAKE/Sudarshan.csv', line 1, character 89 Row 1, column
"AUDIT_EVENT"["DETAILS":6]
你能帮忙吗?
我不能使用 varchar
,因为我还需要在查询中查询 xml 的元素。
这是我加载到 table 的方式,我使用默认的 CSV 格式,文件在 S3 中可用。
COPY INTO demo_db.public.app_event
FROM @my_s3_stage/
FILES = ('app_Even.csv')
file_format=(type='CSV');
根据答案,这就是我正在加载的方式
copy into demo_db.public.app_event from (
select
,,,,,
parse_xml(),,,,,,,,,,,parse_xml()
from @~/Audit_Even.csv d
)
file_format = (
type = CSV
)
但是当我执行它时它说处理了零行并且这里没有提到阶段
如果您使用的是 COPY INTO
语句,那么您需要在将数据加载到 table 之前放入一个子查询来转换数据。在复制语句的子查询中使用 parse_xml
,如下所示:
copy into app_event from (
select
,
parse_xml() -- <---- "" is the column number in the CSV that contains the xml
from @~/test.csv.gz d -- <---- This is my own internal user stage. You'll need to change this to your external stage or whatever
)
file_format = (
type = CSV
)
如果没有现有代码的完整示例(您的复制/插入语句),很难为您提供一个好的 SQL 语句。在上面的示例中,我使用默认的 CSV 文件格式选项在自己的 user stage (@~/test.csv.gz
) 中复制了一个文件。您可能正在使用外部阶段,但应该很容易将其适应您自己的示例。
您好,我已经声明了一个 table 这样的
create or replace table app_event (
ID varchar(36) not null primary key,
VERSION number,
ACT_TYPE varchar(255),
EVE_TYPE varchar(255),
CLI_ID varchar(36),
DETAILS variant,
OBJ_TYPE varchar(255),
DATE_TIME timestamp,
AAPP_EVENT_TO_UTC_DT timestamp,
GRO_ID varchar(36),
OBJECT_NAME varchar(255),
OBJ_ID varchar(255),
USER_NAME varchar(255),
USER_ID varchar(255),
EVENT_ID varchar(255),
FINDINGS varchar(255),
SUMMARY variant
);
DETAILS 列将包含 xml 文件,以便我可以 运行 xml 函数并获取该 xml 文件的元素。
我的示例行如下所示
dfjkghdfkjghdf8gd7f7997,0,TEST_CASE,CHECK,74356476476DFD,<?xml version="1.0" encoding="UTF-8"?><testPayload><testId>3495864795uiyiu</testId><testCode>COMPLETED</testCode><testState>ONGOING</testState><noOfNewTest>1</noOfNewTest><noOfReviewRequiredTest>0</noOfReviewRequiredTest><noOfExcludedTest>0</noOfExcludedTest><noOfAutoResolvedTest>1</noOfAutoResolvedTest><testerTypes>WATCHLIST</testerTypes></testPayload>,CASE,41:31.3,NULL,948794853948dgjd,(null),dfjkghdfkjghdf8gd7f7997,test user,dfjkghdfkjghdf8gd7f7997,NULL,(null),(null)
当我将 DETAILS
声明为 varchar
时,我能够加载文件,但是当我将其声明为 variant
时,我仅在该列中出现错误
Error parsing JSON: dfjkghdfkjghdf8gd7f7997COMPLETED</status File 'SNOWFLAKE/Sudarshan.csv', line 1, character 89 Row 1, column "AUDIT_EVENT"["DETAILS":6]
你能帮忙吗?
我不能使用 varchar
,因为我还需要在查询中查询 xml 的元素。
这是我加载到 table 的方式,我使用默认的 CSV 格式,文件在 S3 中可用。
COPY INTO demo_db.public.app_event
FROM @my_s3_stage/
FILES = ('app_Even.csv')
file_format=(type='CSV');
根据答案,这就是我正在加载的方式
copy into demo_db.public.app_event from (
select
,,,,,
parse_xml(),,,,,,,,,,,parse_xml()
from @~/Audit_Even.csv d
)
file_format = (
type = CSV
)
但是当我执行它时它说处理了零行并且这里没有提到阶段
如果您使用的是 COPY INTO
语句,那么您需要在将数据加载到 table 之前放入一个子查询来转换数据。在复制语句的子查询中使用 parse_xml
,如下所示:
copy into app_event from (
select
,
parse_xml() -- <---- "" is the column number in the CSV that contains the xml
from @~/test.csv.gz d -- <---- This is my own internal user stage. You'll need to change this to your external stage or whatever
)
file_format = (
type = CSV
)
如果没有现有代码的完整示例(您的复制/插入语句),很难为您提供一个好的 SQL 语句。在上面的示例中,我使用默认的 CSV 文件格式选项在自己的 user stage (@~/test.csv.gz
) 中复制了一个文件。您可能正在使用外部阶段,但应该很容易将其适应您自己的示例。