我下面有一个这样的数据框,其中只有一列和一行,我想创建一个函数,用一些文本替换匹配的字符串。
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"))
可能是错误的。
有人可以帮我吗?
答案 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"
。