虽然在Stack Overflow上有几篇关于这个主题的文章,但没有一篇与我的用例完全匹配。我正在使用Linux shell脚本运行SnowSQL来生成一个json文件。
我的json文件需要在json对象之间使用逗号。
这一点:
{
"CAMPAIGN": "Welcome_New",
"UUID": "fe881781-bdc2-41b2-95f2-e0e8c19dc597"
}
{
"CAMPAIGN": "Welcome_Existing",
"UUID": "77a41c02-beb9-48bf-ada4-b2074c1a78cb"
}
......需要看起来像这样:
{
"CAMPAIGN": "Welcome_New",
"UUID": "fe881781-bdc2-41b2-95f2-e0e8c19dc597"
},
{
"CAMPAIGN": "Welcome_Existing",
"UUID": "77a41c02-beb9-48bf-ada4-b2074c1a78cb"
}
下面是完整的ksh脚本:
#!/usr/bin/ksh
. /appl/.snf_logon
export SNOW_PKEY_FILE=$(mktemp ./pkey-XXXXXX)
trap "rm -f ${SNOW_PKEY_FILE}" EXIT
LibGetSnowCred
{
outFile=JSON_FILE_TYPE_TEST.json
inDir=/testing
outFileNm=@my_db.my_schema.my_file_stage/${outFile}
snowsql \
--private-key-path $SNOW_PKEY_FILE \
-o exit_on_error=true \
-o friendly=false \
-o timing=false \
-o log_level=ERROR \
-o echo=true <<!
COPY INTO ${outFileNm}
FROM (SELECT object_construct(
'UUID',UUID
,'CAMPAIGN',CAMPAIGN)
FROM my_db.my_schema.JSON_Test_Table
LIMIT 2)
FILE_FORMAT=(
TYPE=JSON
COMPRESSION=NONE
)
OVERWRITE=True
HEADER=False
SINGLE=True
MAX_FILE_SIZE=4900000000
;
get ${outFileNm} file://${inDir}/;
rm ${outFileNm};
!
if [ $? -eq 0 ]; then
echo "Export successful"
else
echo "ERROR in export"
fi
}
最佳实践是在SELECT期间还是在生成文件之后添加逗号?如何添加?
1条答案
按热度按时间h7appiyu1#
不管有没有这个逗号,文本仍然不是JSON,而只是一个看起来像JSON的随机文本。您导出了几行,每行作为一个独立的对象。您需要将所有这些对象聚集到一个数组中以生成有效的JSON。
对行数组进行编码的JSON如下所示:
生成此输出的最简单方法是询问数据库是否支持此选项(在生成JSON之前将所有记录 Package 到一个列表中,而不是在单独的JSON中导出每条记录)。
如果这不可能,那么您有一个包含多个JSON的文件,您可以使用
jq
将这些单独的JSON转换为类似于上面描述的JSON(编码对象数组)。事情就这么简单:
选项
--slurp
告诉jq
从内存中的input_file
文件中读取所有JSON,解析它们并将它们放入一个数组中,这是程序的输入。'.'
是jq
程序。它说 “转储当前对象”。它不对输入数据做任何处理。当前对象是数组。在执行程序之后(在本例中,它什么也不做),
jq
将修改后的值(当然是JSON)转储到标准输出(默认情况下,在屏幕上)。> output_file
部分将此输出重定向到一个文件(名为output_file
),而不是在屏幕上显示。你可以在
jq
操场上看到how it works。