PySpark DF и RDD кодировка латинских букв - PullRequest
0 голосов
/ 03 июля 2018

Мне нужно импортировать CSV файл в Spark и преобразовать его в DF, а затем в RDD перед обработкой.

Сначала я импортирую полный файл CSV как DF

stopwords_df = (
    sqlc
    .read
    .format('csv')
    .option('header', True)
    .option('delimiter', ';')
    .option('encoding', 'latin1')
    .load('/mnt/sparkdata/stopwords.csv', schema = stopSchema)
    .repartition(72)
)

Затем я выбираю только подходящие слова и превращаю их в набор

stopwords_set = set(
    stopwords_df
    .filter(f.col('retain').isNull())
    .rdd
    .map(lambda x: x[0].encode('latin1')) # the [0] is to extract strings from Rows
    .collect()
)

Я запутался с кодировкой и не знаю, как это исправить.

Если я «покажу» DF, латинские буквы будут показаны правильно (sperò)

stopwords_df.show(100, truncate = False)

+--------------+--------+------+----------+------+
|word          |language|type  |doubletype|retain|
+--------------+--------+------+----------+------+
|informava     |IT      |verbo |null      |null  |
|sperò         |IT      |verbo |null      |null  |
|four          |EN      |null  |null      |null  |

Но этого не произойдет, если я покажу СДР

(
    stopwords_df
    .filter(f.col('word') == r'sperò')
    .rdd
    .first()
)

Row(word=u'sper\xf2', language=u'IT', type=u'verbo', doubletype=None, retain=None)

С UTF-8 encoding тоже будет хуже

+--------------+--------+------+----------+------+
|word          |language|type  |doubletype|retain|
+--------------+--------+------+----------+------+
|thanks        |EN      |saluto|null      |null  |
|fossero       |IT      |verbo |null      |null  |
|sper�         |IT      |verbo |null      |null  |

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

1 Ответ

0 голосов
/ 28 сентября 2018

После просмотра этой строки:

Row(word=u'sper\xf2)

Это означает, что вы используете Python 3. Кодировка по умолчанию для Python 3 - это utf-8, и она поддерживает по умолчанию.

Следовательно, ò заменяется на \ xf2, когда вы указали закодировать его как latin1.

Почему бы вам не собрать без кодировки как latin1?

stopwords_set = set(
    stopwords_df
    .filter(f.col('retain').isNull())
    .rdd
    .collect()
)

Дайте мне знать, если это поможет. Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...