从 Google BigQuery 中过滤或替换非英文字符

Posted

技术标签:

【中文标题】从 Google BigQuery 中过滤或替换非英文字符【英文标题】:Filtering out or replacing non English characters from Google BigQuery 【发布时间】:2018-11-08 19:40:05 【问题描述】:

我正在从 Google Biqquery 中的查询中提取数据。我通过 python 脚本连接到 Google API,在 python 脚本中执行查询并将查询结果写入 CSV 文件。 当我从脚本中对样本数据(100 行)执行查询时,一切看起来都很好。但是当我为整个数据执行脚本时,它失败了。

UnicodeEncodeError: 'ascii' codec can't encode character u'\xe7' in position 38: ordinal not in range(128)

我看到这是一个 python 错误,但是当脚本试图处理包含非英文字符的记录时会发生这种情况。 我在 Hive 中遇到了同样的问题,但我通过使用下面给出的 RLIKE 函数解决了这个问题

  (CASE WHEN FIELD1 not rlike '[^a-zA-Z()\\|\\d\\s\\(_)\\-\\(/):]' THEN FIELD1 ELSE 'data' END) AS FIELD1

Google BigQuery 中是否有类似的方法或功能来查找和替换非英文字符? 或者,这可以在 python 脚本中处理吗?

代码sn-p:

job_id, _results = MY_CLIENT.query("""select FIELD1, FIELD2, FIELD3, FIELD4 FROM TABLE1""", use_legacy_sql=True)
complete, row_count = MY_CLIENT.check_job(job_id)
results = MY_CLIENT.get_query_rows(job_id)
outfile =  open('C:\\Users\\test.csv', 'w')
for row in results:
    for key in row.keys():
        if key == 'FIELD4':
            outfile.write("%s" %str(row[key]))
        else:
            outfile.write("%s," %str(row[key]))
    outfile.write("\n")
outfile.close()  

提前感谢您的帮助!

【问题讨论】:

你用的是python 2.7吗? 是的,我使用的是 Python 2.7 【参考方案1】:

您可以使用下面的来删除非 ascii 字符

REGEXP_REPLACE(field1, r'([^\pASCII]+)', '')

下面是一个例子,你可以看看它是如何工作的

#standardSQL
WITH `project.dataset.table` AS (
  SELECT '12 - Table - Стол - test' AS field1 UNION ALL
  SELECT '23 - Table - الطاولة' UNION ALL
  SELECT '34 - Table - שולחן' 
)
SELECT 
  REGEXP_REPLACE(field1, r'([^\pASCII]+)', '') AS ascii_only,
  field1
FROM `project.dataset.table` 

结果

Row ascii_only          field1   
1   12 - Table - - test 12 - Table - Стол - test     
2   23 - Table -        23 - Table - الطاولة     
3   34 - Table -        34 - Table - שולחן   

【讨论】:

感谢米哈伊尔的REGEXP_REPLACE(field1, r'([^\pASCII]+)', '')。我能够处理大量数据。但是由于字符 u'\u25ba',我再次遇到了失败。 REGEXP_REPLACE 一般可以用来消除任何非 UTF-8 吗? 我能够处理大量数据。但是由于字符 u'\u25ba',我再次遇到了失败。 REGEXP_REPLACE 一般可以用来消除任何非 UTF-8 吗? 我刚刚添加了这个字符来测试你可以在我的答案中找到的虚拟数据 - 它有效 - 这意味着字符 - \u25ba - 已被删除! 谢谢米哈伊尔。我的评论中提到的先前失败是由于另一个问题,我修复了它。这段代码完美运行!【参考方案2】:

此问题与 Python 2.7 相关,并且它缺乏对处理 unicode 的支持,因此所有内容都以基本 ASCII(7 位)编码。

不丢失这些字符的一种方法是在您的脚本中明确地使用UTF-8

outfile.write("%s" %(row[key].encode('utf-8'))

这就是在 python 3.x 中默认会发生的情况,所以这就是你看不到错误的原因。

不过,也许最好的做法是先将这些数据导出到 GCS,然后从那里开始工作(如果可以的话,也可以迁移到 Python 3.x,这样会更好;)!)

【讨论】:

谢谢威廉。当我使用代码时。我收到以下错误: [I] AttributeError: 'int' object has no attribute 'encode' [/I] 那是因为其中一个字段具有数字数据。所以我尝试了:outfile.write("%s" %str(row[key].encode('utf-8')) 我遇到了这个错误:[I] AttributeError: 'NoneType' object has no attribute 'encode' [/I]

以上是关于从 Google BigQuery 中过滤或替换非英文字符的主要内容,如果未能解决你的问题,请参考以下文章

未知 BigQuery Google Ads 数据传输服务错误:非经理帐户不存在(或帐户未处于活动状态),因此不会导入数据

在 BigQuery 中按 Google Analytics 自定义维度过滤

从 Google BigQuery 标准 SQL 中的数组生成随机值

通过正则表达式过滤器过滤 Google BigQuery 列

Google Bigquery 查询记录数据 - 专利

将数据从 Google 永久磁盘加载到 BigQuery?