我是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.
任何帮助改编这一点的人都会非常感激。如果需要更多信息/解释,请告诉我。
答案 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')