我有一个来自csv项目的spark数据框。
csv_df = sqlContext.read.format("csv").option("header", "true").option("inferSchema", "false").load(csv_path)
有一个列为“速度”
速度:[3、5、4、8、7、6、1]
我想添加一个新列以标识这是加速度还是加速度。
要首先实现此目的,我需要找到最大项[8],并将所有项标记为“ A”,直到此为止,然后将“ D”标记为开始:
Accel:[“ A”,“ A”,“ A”,“ A”,“ D”,“ D”,“ D”]
我可以使用pandas和numpy库来实现
#find max location:
maxloc=np.argmax(csv_pandas_df.Speed)
csv_pandas_df.loc[0:maxloc,'Accel']='A'
csv_pandas_df.loc[maxloc:csv_pandas_df.shape[0],'Accel']='D'
是否有任何方法可以通过使用本机Spark DataFrame来实现?
答案 0 :(得分:0)
不确定本机火花,但是可以使用UDF(用户定义函数)来实现。
from pyspark.sql.functions import udf
import operator
def acc_dec(speeds):
if len(speeds) is 0:
return []
index, value = max(enumerate(speeds), key=operator.itemgetter(1))
return ["A"]*(index+1) + ["D"]*(len(speeds)-index-1)
acc_dec_udf = udf(acc_dec)
df_accel = csv_df.withColumn("Accel", acc_dec_udf("Speed"))