使用 bq load 加载带有 NULL 列的 CSV

Posted

技术标签:

【中文标题】使用 bq load 加载带有 NULL 列的 CSV【英文标题】:Loading CSV with NULLs columns using bq load 【发布时间】:2015-01-03 16:36:14 【问题描述】:

我正在尝试使用 bq 工具将在 mysql(使用 outfile)中生成的 CSV 文件(实际上是 TSV)上传到 Bigquery。该表具有以下架构:

这里是示例数据文件:

"6.02"  "0000"  "101"   \N  "Md Fiesta Chicken|1|6.69|M|300212|100|100^M Sourdough|1|0|M|51301|112|112" "6.5"   \N  "V03"   "24270310376"   "10/17/2014 3:34 PM"    "6.02"  "30103" "452"   "302998"    "2014-12-08 10:57:15"   \N

这就是我尝试使用 bq CLI 工具上传它的方式:

$ bq load -F '\t' --quote '"' --allow_jagged_rows receipt_archive.receipts /tmp/rec.csv
BigQuery error in load operation: Error processing job
'circular-gist-812:bqjob_r8d0bbc3192b065_0000014ab097c63c_1': Too many errors encountered. Limit is: 0.
Failure details:
- File: 0 / Line:1 / Field:16: Could not parse '\N' as a timestamp.
Required format is YYYY-MM-DD HH:MM[:SS[.SSSSSS]]

我认为问题在于 updated_at 列是 NULL 并因此被跳过。那么知道如何告诉它考虑空/空列吗?

【问题讨论】:

不是“跳过”;它被拒绝了。 @Strawberry:代表不代表编程专业! 与***.com/q/13050296/560648 非常相似(可能足以称其为骗子);这看起来像是导出和输入工具之间的格式差异(\N 不是“标准”CSV) @Strawberry 你是什么意思? “应付账款不太可能是浮动的”为什么不能浮动?它的应付金额。如果不是浮点数,它会是什么数据类型? 十进制。人们可能会对那些微不足道的小部分非常感兴趣! 【参考方案1】:

CuriousMind - 这不是答案。只是使用浮点数而不是小数的问题的一个例子......

CREATE TABLE fd (f FLOAT(5,2),d DECIMAL(5,2));

INSERT INTO fd VALUES (100.30,100.30),(100.70,100.70;

SELECT * FROM fd;
+--------+--------+
| f      | d      |
+--------+--------+
| 100.30 | 100.30 |
| 100.70 | 100.70 |
+--------+--------+

SELECT f/3+f/3+f/3,d/3+d/3+d/3 FROM fd;
+-------------+-------------+
| f/3+f/3+f/3 | d/3+d/3+d/3 |
+-------------+-------------+
|  100.300003 |  100.300000 |
|  100.699997 |  100.700000 |
+-------------+-------------+

SELECT (f/3)*3,(d/3)*3 FROM fd;
+------------+------------+
| (f/3)*3    | (d/3)*3    |
+------------+------------+
| 100.300003 | 100.300000 |
| 100.699997 | 100.700000 |
+------------+------------+

但我听到你问为什么这是个问题?

好吧,考虑以下...

SELECT * FROM fd WHERE f <= 100.699997;
+--------+--------+
| f      | d      |
+--------+--------+
| 100.30 | 100.30 |
| 100.70 | 100.70 |
+--------+--------+

...现在肯定不是在处理金钱时所期望的吗?

【讨论】:

对,除了大查询不支持小数。从this list 可以看出,没有十进制数据类型。只有整数和浮点数。有意义吗? 我没有意识到 [gulps]。但这有关系吗? bq遇到mysql的十进制数据类型怎么办? “当 bq 遇到 mysql 的十进制数据类型时会发生什么” - 这应该不是问题,因为当存储为浮点数或十进制时,6.76.7。我们只需要在对它们进行算术运算时小心。【参考方案2】:

要在 CSV 文件中指定“null”,请省略该字段的所有数据。 (看起来您正在使用未指定的转义语法“\N”。)

例如:

$ echo 2, > rows.csv
$ bq load tmp.test rows.csv a:integer,b:integer
$ bq head tmp.test
+---+------+
| a |  b   |
+---+------+
| 2 | NULL |
+---+------+

【讨论】:

以上是关于使用 bq load 加载带有 NULL 列的 CSV的主要内容,如果未能解决你的问题,请参考以下文章

Bigquery - 在一列中加载带有“#N/A”的 CSV

在 Windows 上使用 bq load 和 python 子进程分隔的加载管道

带有子目录的 GS 位置的 bq 加载失败

某些列的 Google BigQuery bq 负载?

BQ 加载带有数组数组的 JSON 文件

如何获得 BQ 文件加载的进度