2017-09-06 1 views
0

J'ai des problèmes avec le morceau de code suivant:calcul dissymétrie utilisant spark.sql et Cloudant

def skewTemperature(cloudantdata,spark): 
    return spark.sql("""SELECT (1/count(temperature)) * (sum(POW(temperature-%s,3))/pow(%s,3)) as skew from washing""" %(meanTemperature(cloudantdata,spark),sdTemperature(cloudantdata,spark))).first().skew 

meanTemperature et sdTemperature fonctionnent bien mais avec la requête ci-dessus, je reçois l'erreur suivante:

Py4JJavaError: An error occurred while calling o2849.collectToPython. 
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 3 in stage 315.0 failed 10 times, most recent failure: Lost task 3.9 in stage 315.0 (TID 1532, yp-spark-dal09-env5-0045): java.lang.RuntimeException: Database washing request error: {"error":"too_many_requests","reason":"You've exceeded your current limit of 5 requests per second for query class. Please try later.","class":"query","rate":5 

Est-ce que quelqu'un sait comment résoudre ce problème?

+0

s'il vous plaît poser une question clairement, il n'est pas clair – Kondal

Répondre

0

L'erreur indique que vous dépassez le seuil d'invocation de l'API Cloudant pour la classe de requête, qui semble être de 5/sec pour le plan de service que vous utilisez. Une solution possible est de limiter le nombre de partitions en définissant la propriété de configuration jsonstore.rdd.partitions, comme indiqué dans le Spark 2 exemple suivant:

spark = SparkSession\  
     .builder\  
     .appName("Cloudant Spark SQL Example in Python using dataframes")\ 
     .config("cloudant.host","ACCOUNT.cloudant.com")\  
     .config("cloudant.username", "USERNAME")\  
     .config("cloudant.password","PASSWORD")\  
     .config("jsonstore.rdd.partitions", 5)\  
     .getOrCreate() 

Commencez avec 5 et travailler votre chemin jusqu'à 1 si l'erreur persiste. Ce paramètre limite essentiellement le nombre de demandes simultanées envoyées à Cloudant. Si un paramètre de 1 ne résout pas le problème, vous devrez peut-être envisager de passer à un plan de service avec un seuil plus élevé.