我有一组文件。文件的路径保存在文件中,例如“all_files.txt”。使用apache spark,我需要对所有文件进行操作并对结果进行处理。
我想要做的步骤是:
这是我为此写的代码:
def return_contents_from_file (file_name):
return spark.read.text(file_name).rdd.map(lambda r: r[0])
def run_spark():
file_name = 'path_to_file'
spark = SparkSession \
.builder \
.appName("PythonWordCount") \
.getOrCreate()
counts = spark.read.text(file_name).rdd.map(lambda r: r[0]) \ # this line is supposed to return the paths to each file
.flatMap(return_contents_from_file) \ # here i am expecting to club all the contents of all files
.flatMap(do_operation_on_each_line_of_all_files) # here i am expecting do an operation on each line of all files
这引发了错误:
第323行,在get_return_value中py4j.protocol.Py4JError:出错 在拨打o25时发生。 getnewargs 。跟踪:py4j.Py4JException: 方法 getnewargs ([])不存在于 py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:318) 在 py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:326) 在py4j.Gateway.invoke(Gateway.java:272)at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132) 在py4j.commands.CallCommand.execute(CallCommand.java:79)at py4j.GatewayConnection.run(GatewayConnection.java:214)at java.lang.Thread.run(Thread.java:745)
有人可以告诉我我做错了什么以及我该如何继续下去。提前谢谢。
答案 0 :(得分:17)
不允许在spark
内使用flatMap
或在执行程序上发生任何转换(spark
会话仅在驱动程序上可用)。也无法创建RDD的RDD(参见:Is it possible to create nested RDDs in Apache Spark?)
但是您可以通过其他方式实现此转换 - 将all_files.txt
的所有内容读入数据框,使用本地 map
使其成为数据帧并本地 reduce
联合所有,请参见示例:
>>> filenames = spark.read.text('all_files.txt').collect()
>>> dataframes = map(lambda r: spark.read.text(r[0]), filenames)
>>> all_lines_df = reduce(lambda df1, df2: df1.unionAll(df2), dataframes)
答案 1 :(得分:0)
我今天遇到了这个问题,最后发现我在spark.DataFrame
中引用了pandas_udf
对象,导致了此错误。
结论:
您不能在sparkSession
和spark.DataFrame
中使用udf
对象,pandas_udf
对象或其他Spark分布式对象,因为它们是未腌制的。
如果遇到此错误,并且您正在使用udf
,请仔细检查,肯定是相对问题。
答案 2 :(得分:0)
当模型本身是mlflow.sklearn.log_model
模型时,尝试使用pyspark.ml.classification
用MLFlow记录我的模型时,我也遇到此错误。使用mlflow.spark.log_model
解决了这个问题。