pyspark上的此功能有什么问题?

时间:2019-07-18 13:16:23

标签: python pyspark

我下面有一个这样的数据框,其中只有一列和一行,我想创建一个函数,用一些文本替换匹配的字符串。

df2 = pd.DataFrame([['_text1']],columns = ['my_texts'])
spark_df = spark.createDataFrame(df2)

def text_func(df, col):
    return df.withColumn("origin_code", sparkSqlFunctions.when("my_texts".startswith('_text1') == True, 'text_passed')
                         .otherwise("my_texts"))

该函数不起作用,并给我一个错误“数据框对象没有属性'text_func'”。

我这样称呼它 final = spark_df.withColumn("my_texts", text_func(spark_df, "my_texts")) 可能是错误的。

有人可以帮我吗?

2 个答案:

答案 0 :(得分:1)

您可以尝试以下方法:

from pyspark.sql import SparkSession, SQLContext, Column
from pyspark.sql import functions as F
from pyspark.sql.types import StringType
from pyspark.sql.functions import udf
import pandas as pd

spark = SparkSession.builder.appName('test').getOrCreate()
df2 = pd.DataFrame([['_text1']],columns = ['my_texts'])
spark_df = spark.createDataFrame(df2)
spark_df.show()

text_func = udf(lambda my_texts: "text_passed" if my_texts.startswith('_text1') == True else my_texts, StringType())
df = spark_df.withColumn('my_texts', text_func(spark_df['my_texts']))
df.show()

一种更简单的方法是使用函数instr在一行中完成此操作:

df = spark_df.withColumn("my_texts", F.when(F.instr(spark_df["my_texts"], '_text1')>0, 'text_passed').otherwise("my_texts"))
df.show()

答案 1 :(得分:1)

在您的功能中,更改

task = [_session downloadTaskWithURL:attachmentURL
                       completionHandler: ^(NSURL *temporaryFileLocation, NSURLResponse *response, NSError *error) {
                           if (error != nil) {
                               NSLog(@"error:%@", error.localizedDescription);
                           } else {
                               NSString *filePath = [self saveFrom:...];
                               dispatch_async(dispatch_get_main_queue(), ^{
                                   NSLog(@"%@", filePath);
                                   NSData *data = [NSData dataWithContentsOfFile:filePath];
                                   NSLog(@"data length: %lu", data.length);
                                   // data length is error! smaller than should be
                               });
                           }
                       }];
    [task resume];

"my_texts".startswith('_text1')

这可能是造成混淆的原因。这个对我有用。

通过此修改,我明确告诉spark第一个sparkSqlFunctions.col("my_texts").startswith('_text1') 是一列,而不是字符串。

您还可以从代码中删除"my_texts"