Фильтрация или замена неанглийских символов из Google BigQuery - PullRequest
0 голосов
/ 08 ноября 2018

Я извлекаю данные из запроса в Google Biqquery. Я подключаюсь к Google API через скрипт Python, выполняю запрос внутри скрипта Python и записываю результаты запроса в файл CSV. Когда я выполняю запрос из сценария для образца данных (100 строк), все выглядит хорошо. Но когда я выполняю сценарий для всех данных, он терпит неудачу.

UnicodeEncodeError: кодек 'ascii' не может кодировать символ u '\ xe7' в позиции 38: порядковый номер не в диапазоне (128)

Я вижу, что это ошибка Python, но это происходит, когда скрипт пытается обработать записи, которые имеют неанглийские символы. Я столкнулся с той же проблемой в Hive, но я обошел ее с помощью функции RLIKE, приведенной ниже

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

Существует ли аналогичный метод или функция в 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()  

Заранее спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Эта проблема связана с Python 2.7 и отсутствием поддержки обработки юникода, поэтому все кодируется в базовом ASCII (7 бит).

Одним из способов не потерять эти символы является явная работа в UTF-8 в вашем скрипте:

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

Это то, что происходит по умолчанию в python 3.x, поэтому вы не увидите ошибки.

Тем не менее, возможно, наилучшей практикой будет сначала экспортировать эти данные в GCS, а затем работать оттуда (а также, если возможно, перейти на Python 3.x, это намного лучше;)!)

0 голосов
/ 08 ноября 2018

Вы можете использовать ниже, чтобы удалить не ascii символов

REGEXP_REPLACE(field1, r'([^\p{ASCII}]+)', '')

Ниже приведен пример, с которым вы можете поиграть, чтобы увидеть, как он работает

#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'([^\p{ASCII}]+)', '') 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 - שולחן   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...