我尝试将 Firebase 实时数据库的备份从 Google Cloud Storage 导入 BigQuery 并收到以下错误:
字段名称“名称”无效。字段只能包含字母、数字和下划线,以字母或下划线开头,长度最多为 128 个字符。表:表测试
我尝试了第二个数据集,它返回以下错误:
无效的字段名称“-Kq4_0dsRwKfOGGxGoQv”。字段只能包含字母、数字和下划线,以字母或下划线开头,长度最多为 128 个字符。表:表测试
这是第二个数据集:
{"users":{"someUserID_abc":{"tests":{"-Kq4_0dsRwKfOGGxGoQv":"07/02/2019 19:44:22","-Kq4_vUQTQ3b6gqMkfRL":"07/02/2019 19:48:20","-Kq4a84n9WMu3NGiE4qW":"07/02/2019 19:53:36"}}}}
在我的初始(非常大)数据集中,有很多独特的 firebase 键,它们是 由 firebase 唯一生成的,并且通常以“-”开头(这似乎会在 BigQuery 中产生错误)。
我在创建表屏幕上的设置是:
Source
Create table from: Google Cloud Storage
Select file from GCS bucket: myproject-backups/2019-07-03T02:23:34Z_myproject_data.json.gz
File format: JSON (Newline delimited)
Destination
Project name: myproject
Dataset name: database
Table type: Native table
Table name: tabletest
Schema
Auto detect
(checked) Schema and input parameters
enter code here
在“创建表”屏幕上单击“创建表”按钮后,出现上述错误。
我尝试了不同的数据集和表名称,调整了表类型,查看了以下各项以寻找答案,但没有任何运气:
基于here,我猜测错误是“
Name
”中有一个空格(可能来自数据库?)并且我有很多由firebase生成的随机密钥(以前导“ -”)。这是一个非常大的数据集,因此我什至无法在程序冻结的情况下解压缩并打开初始 gzip 文件(甚至纯文本编辑器)。
编辑: 我创建了以下脚本来进行gunzip,“清理”.gzip 中所有密钥的数据,然后重新 gzip 文件:
# remove spaces, replace leading dashmarks (replace - with the word 'dashmark'), add an underscore before numbers
file=$"myfile.json.gz"
gunzip "$file"
sed -e "s/Name /Name/g" -e "s/-/dashmark/g" -e "s/{\"\([0-9]+\)/{\"_\1/g" -e "s/,\"\([0-9]+\)/,\"_\1/g" -e "s/,\"\"/\,\"_\"/g" -e "s/{\"\"/\{\"_\"/g" < "${file%.gz}" | gzip -c > "${file%.gz}.gz"
这似乎消除了“无效的字段名称...”错误,但引入了以下错误:
读取数据时出错,错误信息:无法解析JSON: 意外的标记;无法解析值;无法解析值;可以 不解析值;无法解析值;无法解析值;可以 不解析值;无法解析值;无法解析值;可以 不解析值;无法解析值;无法解析值;可以 不解析值;解析器在字符串结束之前终止
我确实对
sed
语句很陌生,所以也许我打字或写错了脚本,导致在我的尝试中创建了无效的 JSON 对象?
有谁知道如何从 .gzip 中的所有键中删除空格/特殊字符(或解决此错误的任何其他方法以将 Firebase RTD .gzip 导入 BigQuery)?
如果您准确复制了错误消息,则字符串“Name”中似乎有空格或其他空白字符。正如错误消息所告诉您的那样,该空白字符无效。您必须深入挖掘数据才能找出无效字符的确切来源。
运行时也会打印这个错误
bq mk --table --schema xyz.json
并且 JSON 文件不存在于您运行命令的文件夹中。
mk 操作中的 BigQuery 错误:字段名称“xyz.json”无效。字段只能包含字母、数字和下划线,开头为 字母或下划线,长度最多 300 个字符。
找不到文件,但该错误让您认为您的架构 JSON 存在问题。
在我的例子中,.gitignore 文件排除了 json 文件,因此 bq mk 命令无法找到该文件