![](/img/trans.png)
[英]Access global variable from UDF (User Defined Function) in python in spark
[英]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()
並從那里開始。
或者,你可以寫你的udf
中scala
,因為這將是在執行自動並行。
或者,也可以查看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.