Pyspark:从pyspark dataframe中删除UTF空字符

5
我有一个类似以下的pyspark数据框:
df = sql_context.createDataFrame([
  Row(a=3, b=[4,5,6],c=[10,11,12], d='bar', e='utf friendly'),
  Row(a=2, b=[1,2,3],c=[7,8,9], d='foo', e=u'ab\u0000the')
  ])

其中一列的值 e 包含 UTF 空字符 \u0000。如果我尝试将此 df 加载到 PostgreSQL 数据库中,会出现以下错误:
ERROR: invalid byte sequence for encoding "UTF8": 0x00 

这很有道理。在将数据加载到Postgres之前,我该如何高效地从pyspark dataframe中删除null字符?
我已经尝试使用一些pyspark.sql.functions来清洗数据,但没有成功。encode、decode和regex_replace都没有起作用:
df.select(regexp_replace(col('e'), u'\u0000', ''))
df.select(encode(col('e'), 'UTF-8'))
df.select(decode(col('e'), 'UTF-8'))

理想情况下,我希望在不指定确切列或违规字符的情况下清理整个数据框,因为我不一定预先知道这些信息。
我正在使用带有UTF8编码的Postgres 9.4.9数据库。
2个回答

2

等等 - 我想我明白了。如果我像这样做,似乎可以工作:

null = u'\u0000'
new_df = df.withColumn('e', regexp_replace(df['e'], null, ''))

然后将所有字符串列映射:

string_columns = ['d','e']
new_df = df.select(
  *(regexp_replace(col(c), null, '').alias(c) if c in string_columns else c for
    c in df.columns)
  )

0

您可以使用DataFrame.fillna()来替换空值。

替换空值,别名为na.fill()。DataFrame.fillna()和DataFrameNaFunctions.fill()是彼此的别名。

参数:

  • value - int、long、float、string或dict。用于替换空值的值。如果值是字典,则忽略子集,并且值必须是从列名称(字符串)到替换值的映射。替换值必须是int、long、float或string。

  • subset - 可选的列名列表。在子集中指定的列如果没有匹配的数据类型则会被忽略。例如,如果值是一个字符串,并且子集包含一个非字符串列,则非字符串列将被简单地忽略。


1
我认为这里不起作用,因为问题单元格实际上并不是空的 - 它包含UTF空字符\u0000。如果在我的示例df上运行df.fillna(),它看起来返回相同的数据框,因为没有一个单元格实际上是空的。如果我尝试将结果df加载到postgres表中,我仍然会收到相同的错误消息。 - Steve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接