修改PySpark列数据帧的所有值

时间:2017-09-26 19:49:32

标签: python apache-spark pyspark apache-spark-sql

我是PySpark数据帧的新手,之前曾经使用过RDD。我有这样的数据框:

date        path
2017-01-01  /A/B/C/D
2017-01-01  /X
2017-01-01  /X/Y

想要转换为以下内容:

date        path
2017-01-01  /A/B
2017-01-01  /X
2017-01-01  /X/Y

基本上要在第三个/之后删除所有内容。所以在使用RDD之前,我曾经有以下内容:

from urllib import quote_plus

path_levels = df['path'].split('/')
filtered_path_levels = []
for _level in range(min(df_size, 3)):
    # Take only the top 2 levels of path
    filtered_path_levels.append(quote_plus(path_levels[_level]))

df['path'] = '/'.join(map(str, filtered_path_levels))

pyspark的事情我会说更复杂。这是我到目前为止所得到的:

path_levels = split(results_df['path'], '/')
filtered_path_levels = []
for _level in range(size(df_size, 3)):
    # Take only the top 2 levels of path
    filtered_path_levels.append(quote_plus(path_levels[_level]))

df['path'] = '/'.join(map(str, filtered_path_levels))

这给了我以下错误:

ValueError: Cannot convert column into bool: please use '&' for 'and', '|' for 'or', '~' for 'not' when building DataFrame boolean expressions.

任何帮助改编这一点的人都会非常感激。如果需要更多信息/解释,请告诉我。

2 个答案:

答案 0 :(得分:0)

使用OR

udf

答案 1 :(得分:0)

我使用以下代码解决了我的问题:

from pyspark.sql.functions import split, col, lit, concat

split_col = split(df['path'], '/')
df = df.withColumn('l1_path', split_col.getItem(1))
df = df.withColumn('l2_path', split_col.getItem(2))
df = df.withColumn('path', concat(col('l1_path'), lit('/'), col('l2_path')))
df = df.drop('l1_path', 'l2_path')