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

Python Pyspark:从Pyspark数据帧中删除UTF空字符,python,postgresql,apache-spark,utf-8,pyspark,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数据库中,会出现以下错误: ERR

我有一个类似于以下内容的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
首先清理数据,但没有成功<代码>编码,
解码
,和
正则表达式替换
不起作用:

df.select(regexp_replace(col('e'), u'\u0000', ''))
df.select(encode(col('e'), 'UTF-8'))
df.select(decode(col('e'), 'UTF-8'))
理想情况下,我希望清除整个数据帧,而不指定确切的列或违反字符是什么,因为我不一定提前知道这些信息


我使用的是postgres 9.4.9数据库,带有
UTF8
编码。

啊,等等,我想我已经有了。如果我做了这样的事情,它似乎是有效的:

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)
  )
可以使用替换空值

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

参数:

  • value–int、long、float、string或dict.value to 将空值替换为。如果值是dict,则子集为 已忽略,且值必须是从列名(字符串)到 重置价值。替换值必须是int、long、float, 或字符串

  • 子集-要考虑的列名的可选列表。柱 忽略在子集中指定的不具有匹配数据类型的。 例如,如果值是字符串,而子集包含非字符串 列,则忽略非字符串列


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