【问题标题】:Load Data Transfert files v2 into Big Query将数据传输文件 v2 加载到 Bigquery
【发布时间】:2016-10-25 12:55:14
【问题描述】:

我目前正在尝试将我们所有的 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 脚本插入 GCS 中的所有数据。

#!/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_2016101220_20161013_073847_299112066.csv.gz:CSV 表引用列位置 101,但从 position: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_accountXXXX_activity_20161012_20161013_040343_299059260.csv | head -n 1

我明白了:

3079,10435077,311776195,75045433,1,2626849,139520233,IT,,28,0.0,22,,4003208,,dc_pre=CLHihcPW1M8CFTEC0woddTEPSQ;~oref=http://imasdk.googleapis.com/js/core/bridge3.146.2_en.html,1979747802,1476255005253094,2,,4233079,CONVERSION,POSTVIEW,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,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

之后:$head -n1 dcm_account8897_activity_20161012_20161013_040343_299059260.csv | awk -F',' '{print NF}'

响应:102

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

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

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我会从 google 表格打开 csv 文件,并将列与您生成的架构进行比较。 您很可能会在架构中发现一个错误。

      【讨论】:

      • 我用另一个测试编辑了我的帖子。我不认为架构。也许我的命令行做错了......
      • 在您添加的测试中,数字 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 并将 skip_leading_rows 设置为 1。
      • 我将尝试使用 allow_quoted_newlines 来解决双引号之间的 url 问题。但这并不能解决具有不同长度的行的问题。我在这个 csv 中没有找到 \n,所以我们不能说不可能得到 2 个不同的长度
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-29
      • 2020-03-24
      • 2018-07-02
      • 1970-01-01
      相关资源
      最近更新 更多