Google bigquery 将数据传输文件v2加载到大查询中

Google bigquery 将数据传输文件v2加载到大查询中,google-bigquery,Google Bigquery,我目前正在尝试将所有的DT文件v2插入BQ。 我已经用点击文件做了,我发现了任何问题 但这与活动和印象不同 我编写了一个快速脚本来帮助我创建插入模式: import csv,json import glob data = [] for i in glob.glob('*.csv'): print i b = i.split("_") print b[2] with open(i, 'rb') as f: reader = csv.reader(f) row1 =

我目前正在尝试将所有的DT文件v2插入BQ。 我已经用点击文件做了,我发现了任何问题

但这与活动和印象不同

我编写了一个快速脚本来帮助我创建插入模式:

import csv,json
import glob
data = []

for i in glob.glob('*.csv'):
  print i
  b = i.split("_")
  print b[2]
  with open(i, 'rb') as f:
    reader = csv.reader(f)
    row1 = next(reader)
  title = [w.replace(' ', '_').replace('/', '_').replace(':', '_').replace('(', '_').replace(')', '').replace("-", "_") for w in row1]
  print title

  for a in title:
    j={"name":"{0}".format(a),"type":"string","mode":"nullable"}
    print j
    if j not in data:
      data.append(j)

  with open('schema_' + b[2] + '.json', 'w') as outfile:
    json.dump(data, outfile)
之后,我使用小bash脚本插入来自地面军事系统的所有数据

#!/bin/bash

prep_files() {
date=$(echo "$f" | cut -d'_' -f4 | cut -c1-8)
echo "$n"
table_name=$(echo "$f" | cut -d'_' -f1-3)
bq --nosync load --field_delimiter=',' DCM_V2."$table_name""_""$date" "$var" ./schema/v2/schema_"$n".json
}


num=1

for var in $(gsutil ls gs://import-log/01_v2/*.csv.gz)
    do
       if test $num -lt 10000
       then
          echo "$var"
          f=$(echo "$var" | cut -d'/' -f5)
          n=$(echo "$f" |  cut -d'_' -f3)
          echo "$n"
          prep_files
          num=$(($num+1))
       else
          echo -e "Wait the next day"
          echo "$num"
          sleep $(( $(date -d 'tomorrow 0100' +%s) - $(date +%s) ))
          num=0
        fi
    done


 echo 'Import done'
但我有这样的错误:

错误: 遇到的错误太多。(错误代码:无效) /gzip/subrange//bigstore/import log/01_v2/dcm_accountXXX_impression_201610120_20161013_073847_29911066.csv.gz:csv表引用列位置101,但从位置0开始的行仅包含101列。(错误代码:无效)

因此,我使用以下方法检查模式中的列数:
$awk-F',“{print NF}”
但我有很多列。。。 所以我认为这是因为我们的值中有逗号(一些发布者正在使用.NET框架,允许url中有逗号)。但这些值用双引号括起来

所以我用一个小文件做了一个测试:

id,url
1,http://www.google.com
2,"http://www.google.com/test1,test2,test3"
这个加载工作

如果有人有线索帮助我,那就太好了。:)

编辑:我做了另一个测试,用一个已经解压缩的文件进行加载

遇到的错误太多。(错误代码:无效) file-00000000:CSV表引用列位置104,但从位置2006877004开始的行仅包含104列。(错误代码:无效)

我使用此命令查找以下行:
$tail-c 2006877004 dcm\u accountXXXX\u activity\u 20161012\u 20161013\u 040343\u 299059260.csv | head-n 1

我得到:

307910435077117761957045433,12626849139520233,IT,28,0.0,22,4003208,dc_pre=CLHihcPW1M8CFTEC0woddTEPSQ~奥列夫=http://imasdk.googleapis.com/js/core/bridge3.146.2_en.html,1979747802147625505253094,2,4233079,转换,后视图,,,,,,,,,,,,,,,,,,,,,,,,,,,1,0.000000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

之后:
$head-n1 dcm\u account8897\u activity\u 20161012\u 20161013\u 040343\u 299059260.csv | awk-F',“{print NF}”

答复:102

所以,我在第一行有104列,在这一行有102列


其他人对DT文件v2有问题吗?

我会从google sheets打开csv文件,并将这些列与您生成的模式进行比较。
很可能您会在模式中发现一个bug。

我也有类似的问题,发现问题是由于一些记录被回车分隔成两行。删除\r\n解决了问题


受影响的行通常不是错误日志中反映的行。

我用另一个测试编辑了我的帖子。我不认为模式是正确的。也许我的命令行做得不对……在您添加的测试中,数字102和数字104来自同一个csv文件,来自不同的行?我无法想象。在您添加的测试中,数字102和数字104来自同一个csv文件,来自不同的行?我无法想象。我猜tail和head命令使用\n作为新行,但是\n可以出现在csv中的值中。在添加的测试中,数字102和数字104来自同一个csv文件,来自不同的行?我无法想象。我猜tail和head命令使用\n作为新行,但是\n可以出现在csv中的值中。我还猜测,如果您尝试使用“bq load”中的其他选项,特别是将“allow_quoted_newlines”设置为true,并将_leading_rows设置为1,那么问题可能会消失。我将尝试使用allow_quoted_newlines来解决双引号之间的url问题。但这并不能解决不同长度行的问题。我在此csv中找不到\n,因此我们不能说不可能获得2个不同的长度