簡體   English   中英

Python 函數上的 Spark UDF

[英]Spark UDF on Python function

我創建了一個 python 函數,用於使用 GCP Translate API 翻譯短字符串。 代碼做這樣的事情。

def translateString(inputString, targetLanguage, apiKey):
    baseUrl = "https://translation.googleapis.com/language/translate/v2?key="
    q = "&q="
    gcpKey = apiKey
    target = "&target="
    sentence = str(inputString)

    #Finialize request url
    url = baseUrl + gcpKey + q + sentence + target

    #SEND REQUEST WITH EXPONENTIAL BACK OFF IN CASE OF ERRORS OF EXCEEDING QUOTA LIMITATIONS API
    session = requests.Session()        
    retry = Retry(connect=3, backoff_factor=100)
    adapter = HTTPAdapter(max_retries=retry)
    session.mount('http://', adapter)
    session.mount('https://', adapter)
    respons = session.get(url, timeout=120)

    if respons.status_code == 200:
      data = respons.json()       
      translatedStr = data["data"]["translations"][0]["translatedText"]
      returnString = str(translatedStr)
      return(returnString)

    else:
      return("Error with code: " + str(respons.status_code))

udfTrans = F.udf(translateString, StringType())

apiKey = *********

dfTempNo = dfToProcess.withColumn("TRANSLATED_FIELD", udfTrans(lit(dfToProcess.FIELD_TO_PROCESS), lit("no"), lit(apiKey)))

當我們循環遍歷pd.DataFrame並存儲返回變量時,這非常pd.DataFrame 但是現在我需要在spark.DataFrame上應用這個函數,以便可以分發工作並創建以下udfTrans = F.udf(translateString, StringType())以便它可以應用於spark.DataFrame string列。

當我在dfTempNo = dfToProcess.withColumn("TRANSLATED_FIELD", udfTrans(lit(dfToProcess.FIELD_TO_PROCESS), lit("no"), lit(apiKey)))上運行dfToProcess ,它不會返回任何錯誤,但需要永遠在dfToProcess上運行超過 1 行。

我不確定我是否誤解了 UDF 如何應用於spark.DataFrame列。 甚至可以使用 UDF 將這樣的函數應用於spark.DataFrame還是我最好在 Python/Pandas 中執行此操作?

Python udf s 不能像這樣並行化,因為您的executor需要回調driver來執行您的udf 不幸的是,這意味着您的udf將阻塞每一行,並且在執行過程中本質上是串行的。

這可以使用不同的方法更有效地解決。 由於您的函數是大量 IO 綁定的(更具體地說是網絡綁定),您可以查看類似ThreadPool實現,將您的輸出存儲在Dict ,然后在您的Dict上調用SparkContext.parallelize()並從那里開始。

或者,你可以寫你的udfscala ,因為這將是在執行自動並行。

或者,也可以查看https://spark.apache.org/docs/2.4.3/api/python/pyspark.sql.html#pyspark.sql.functions.pandas_udf,因為可以矢量化pandas udf 希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM