Pyspark:从pyspark数据帧中删除UTF空字符

时间:2016-12-14 20:50:00

标签: python postgresql apache-spark utf-8 pyspark

我有一个类似于以下的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数据帧中有效地删除空字符?

我尝试使用部分pyspark.sql.functions来清理数据但没有成功。 encodedecoderegex_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 个答案:

答案 0 :(得分:0)

等等啊 - 我想我拥有它。如果我做这样的事情,似乎有效:

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)
  )

答案 1 :(得分:0)

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

  

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

     

参数:

     
      
  • value - int,long,float,string或dict。价值   用。替换空值。如果值是dict,那么子集就是   ignore和value必须是从列名(字符串)到的映射   重置价值。替换值必须是int,long,float,   或字符串。

  •   
  • subset - 要考虑的列名的可选列表。列   在子集中指定的没有匹配数据类型的将被忽略。   例如,如果value是字符串,则子集包含非字符串   列,然后简单地忽略非字符串列。

  •