我学习了如何使用spark-cosmosdb连接器创建来自DataFrame
的数据的CosmosDB
,所以现在我想对DataFrame做一些事情。一切都很好,直到我操作小数据集(或者我在读配置中添加额外的custom_query
来缩小数据范围)。
例如,我可以创建DF,然后执行df.show()
或在其上创建临时视图,然后执行%%sql select * from c
。但是,当我尝试df.count()
或%%sql select * from c order by name desc
时,我收到错误消息:Request rate is large
(Full stacktrace on pastebin)。我想到将表格实现为hive(df.write.saveAsTable(tableName)
)我得到了同样的错误。
有没有办法以某种方式减少调用此类繁重函数时将转到数据库的请求数量?或者在hive中实现数据的另一种方法,以便我可以在以后处理它,而不需要一次又一次地通过连接器?这种限制看起来很像脖子上的疼痛,所以我对数据无能为力。
该集合的吞吐量为400 RU / s。 HdInsinght的参数:Linux上的Spark 2.2(HDI 3.6),Scala:2.11.8。我正在使用JupyterNotebook和PySpark 3内核。这是我正在使用的完整代码:
%%configure -f
{ "name":"Spark-to-Cosmos_DB_Connector",
"jars": ["wasb:///example/jars/1.0.0/azure-cosmosdb-spark_2.2.0_2.11-1.1.0.jar", "wasb:///example/jars/1.0.0/azure-documentdb-1.14.0.jar", "wasb:///example/jars/1.0.0/azure-documentdb-rx-0.9.0-rc2.jar", "wasb:///example/jars/1.0.0/json-20140107.jar", "wasb:///example/jars/1.0.0/rxjava-1.3.0.jar", "wasb:///example/jars/1.0.0/rxnetty-0.4.20.jar"],
"conf": {
"spark.jars.packages": "com.microsoft.azure:azure-cosmosdb-spark_2.2.0_2.11:1.1.0",
"spark.jars.excludes": "org.scala-lang:scala-reflect"
}
}
iotConfig = {
"Endpoint" : "https://myDB.documents.azure.com:443/",
"Masterkey" : "myKey==",
"Database" : "test",
"prefferedRegions" : "West Europe",
"Collection" : "surrogate",
"SamplingRation" : "1.0",
"schema_samplesize" : "1000",
"query_pagesize" : "2147483647"
}
df = spark.read.format("com.microsoft.azure.cosmosdb.spark").options(**iotConfig).load()
df.createOrReplaceTempView("c")
#will work
df.show()
#wont work
%%sql
select count(*) from c
#wont work
%%sql
select * from c order by name desc
#wont work
df.count()
#wont work
df.write.saveAsTable('table')
任何建议都会非常感激。 提前谢谢。
答案 0 :(得分:0)
也许您应该尝试提高集合的吞吐量。这正是Request rate is large
错误指示
答案 1 :(得分:0)
请注意,在使用azure-cosmosdb-spark
时,使用400 RU时,Spark会从集合中请求过多的数据。一种可能的方法是使用pydocumentdb
,其中请求不是来自Spark执行程序(如使用azure-cosmosdb-spark
时),而是来自驱动程序。这可能会降低请求率。
使用azure-cosmosdb-spark
时,您可以通过减小query_pagesize
的大小来降低请求率。这是configuration reference guide当前正在进行的工作。
答案 2 :(得分:0)
我们遇到了类似的问题,我们通过cosmosdb
连接器从azure-cosmosdb-spark
集合(1000 R / U,〜25GB,〜1500万文档)中提取数据。
要进行平滑的批量提取,请在配置中使用query_pagesize = <XXXX>
,其中XXXX应该相对较小(例如〜100K。)。这样可以确保馆藏的负载有限,从而使响应流畅。
要查询加载的DataFrame
并获得计数,我们使用了以下代码。 (斯卡拉)
df.createOrReplaceTempView("c")
var records = spark.sql("SELECT count(*) FROM c")
records.show()`