我使用
@pandas_udf
編寫一個函數,加快這個過程(解析xml文件),然後比較它與單線程的速度,令人驚訝的是,使用@pandas_udf
比單線程代碼慢兩倍。我需要解析和xml文件的數量大約是20000。下麵的代碼顯示了我做了什麼:
火花= SparkSession.builder.appName (EDA) .getOrCreate () spark.conf.set (“spark.sql.execution.arrow。啟用”、“真實”)spark.conf.set (“spark.sql.execution.arrow。maxRecordsPerBatch”、“64”)
@pandas_udf (ArrayType (ArrayType (IntegerType ()))) def parse_xml (xml_names: pd.Series) - > pd。係列:結果= []xml_name xml_names:樹= ET.parse (xml_name)根= tree.getroot () keep_boxes =[]的obj root.iter(“對象”):class_id = int (obj.find(“名字”)。文本)盒= obj.find (“bndbox”) xmin = int (boxes.find (“xmin”)。text) ymin = int (boxes.find (“ymin”)。text) xmax = int (boxes.find (“xmax”)。text) ymax = int (boxes.find (“ymax”)。text) keep_boxes。追加([class_id、xmin ymin, xmax, ymax]) results.append (keep_boxes)返回pd.Series(結果)
#收集所有數據從不同的文件夾數據= np.array (get_data ()) .T.tolist()模式= StructType ([StructField (img_name, StringType(),真的),StructField (xml_name, StringType(),真的)])num_cores = 20 #(核心數量我有)muls = 3 df = spark.createDataFrame(數據、模式).repartition (muls * num_cores) pdf_box = df.select(坳(“img_name”), parse_xml(坳(xml_name)) .alias(“盒子”)).toPandas ()
據我所知,因為我使用for循環利用
pandas_udf
將會消失,因為它不能整個批處理過程,然而,我仍然認為它應該比單線程因為更快火花
數據分解成parititons,而且平行處理它們。如果上麵的概念,我說錯了請糾正我。
所以我想知道為什麼它甚至低於單線程的代碼。是因為我寫的代碼或一些重要的想法,我隻是小姐,謝謝!