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

Jon*_*han 4 python google-bigquery

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

UnicodeEncodeError:“ascii”编解码器无法对位置 38 中的字符 u'\xe7' 进行编码:序数不在范围内(128)

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

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

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

代码片段:

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()  
Run Code Online (Sandbox Code Playgroud)

预先感谢您的帮助!

Mik*_*ant 9

您可以使用下面的方法删除非 ASCII 字符

\n\n
REGEXP_REPLACE(field1, r'([^\\p{ASCII}]+)', '')\n
Run Code Online (Sandbox Code Playgroud)\n\n

下面是您可以尝试一下的示例,看看它是如何工作的

\n\n
#standardSQL\nWITH `project.dataset.table` AS (\n  SELECT '12 - Table - \xd0\xa1\xd1\x82\xd0\xbe\xd0\xbb - test' AS field1 UNION ALL\n  SELECT '23 - Table - \xd8\xa7\xd9\x84\xd8\xb7\xd8\xa7\xd9\x88\xd9\x84\xd8\xa9' UNION ALL\n  SELECT '34 - Table - \xd7\xa9\xd7\x95\xd7\x9c\xd7\x97\xd7\x9f' \n)\nSELECT \n  REGEXP_REPLACE(field1, r'([^\\p{ASCII}]+)', '') AS ascii_only,\n  field1\nFROM `project.dataset.table` \n
Run Code Online (Sandbox Code Playgroud)\n\n

有结果

\n\n
Row ascii_only          field1   \n1   12 - Table - - test 12 - Table - \xd0\xa1\xd1\x82\xd0\xbe\xd0\xbb - test     \n2   23 - Table -        23 - Table - \xd8\xa7\xd9\x84\xd8\xb7\xd8\xa7\xd9\x88\xd9\x84\xd8\xa9     \n3   34 - Table -        34 - Table - \xd7\xa9\xd7\x95\xd7\x9c\xd7\x97\xd7\x9f   \n
Run Code Online (Sandbox Code Playgroud)\n