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

标签 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 数据库。

最佳答案

啊等等 - 我想我知道了。如果我这样做,它似乎有效:

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

关于python - Pyspark:从 pyspark 数据帧中删除 UTF 空字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41151915/

相关文章:

python - 如何使用 pyspark 从 CSV 设置 Spark 中的 parquet 中正确的数据类型

apache-spark - Spark 数据集超过总内存大小

python - 允许 help() 在部分函数对象上工作

Python - 计数符号变化

sql - 表名或列名不能以数字开头?

linux - postgres 用户可以使用任何密码或不使用密码登录

python - 在 Python 中类型转换为 'int' 生成错误结果

python - 将文本与 python 中的多个正则表达式匹配

sql - 使用 Postgres 8.3 或更低版本在另一个字段中选择最大值和对应值

python - Spark 中笛卡尔的替代品?