2016-12-14 310 views
0

刪除UTF空字符我有類似如下的pyspark數據幀: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')) 

理想情況下,我想清潔整個數據幀沒有確切指明哪些列或違規性質是什麼,因爲我沒有必要提前知道這個信息時間。

我正在使用postgres 9.4.9數據庫與UTF8編碼。

回答

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

您可以使用DataFrame.fillna()更換空值。

Replace null values, alias for na.fill(). DataFrame.fillna() and DataFrameNaFunctions.fill() are aliases of each other.

Parameters:

  • value – int, long, float, string, or dict. Value to replace null values with. If the value is a dict, then subset is ignored and value must be a mapping from column name (string) to replacement value. The replacement value must be an int, long, float, or string.

  • subset – optional list of column names to consider. Columns specified in subset that do not have matching data type are ignored. For example, if value is a string, and subset contains a non-string column, then the non-string column is simply ignored.

+0

我不認爲這在這裏工作,因爲問題單元格實際上不是空 - 它包含UTF空字符\ u0000。如果我在我的示例df上運行'df.fillna()',它看起來像返回相同的數據幀,因爲沒有任何單元實際爲空。如果我嘗試將生成的df加載到postgres表中,我仍然會得到相同的錯誤消息。 – Steve