我想从R查询couchbasedb存储桶并将结果存储在数据框中。
我浏览了这个blogpost并尝试使用自定义查询复制我自己群集中的步骤,但在couchbase日志中收到了错误消息
Invalid post received: {mochiweb_request,
[#Port<0.5548256>,'POST',"/query/service/",
{1,1},
{6,
{"host",
{'Host',
"[removed]:8091"},
{"accept-encoding",
{'Accept-Encoding',"gzip, deflate"},
{"accept",
{'Accept',
"application/json, text/xml, application/xml, */*"},
nil,nil},
{"content-type",
{'Content-Type',
"application/x-www-form-urlencoded;charset=UTF-8"},
{"content-length",
{'Content-Length',"59"},
nil,nil},
nil}},
{"user-agent",
{'User-Agent',
"libcurl/7.54.0 r-curl/2.6 httr/1.2.1"},
nil,nil}}}]}
然后我尝试使用R中的reticulate
包来使用python SDK查询couchbasedb。
Python代码:
from couchbase.n1ql import N1QLQuery
from couchbase.bucket import Bucket
import pandas as pd
host = '[host_name]:8091'
bucket = 'my-bucket'
cb = Bucket('couchbase://' + host + '/' + bucket)
query = N1QLQuery('Select * from `my-bucket`')
df = pd.DataFrame()
for row in cb.n1ql_query(query):
df = df.append(row, ignore_index=True)
上面的代码完全正常,并将pandas数据框df
附加到预期值。
以下是我使用reticulate
函数将上述python代码翻译为R的尝试失败
R代码:
library(reticulate)
reticulate::use_condaenv("my-env", "/usr/local/anaconda3/bin/conda")
Bucket <- reticulate::import("couchbase.bucket")$Bucket
N1QLQuery <- reticulate::import("couchbase.n1ql")$N1QLQuery
pd <- reticulate::import("pandas", "pd")
host <- '[host_name]:8091'
bucket <- 'my-bucket'
cb <- Bucket(paste0('couchbase://', host, '/', bucket))
query = N1QLQuery('Select * from `my-bucket`')
到目前为止,一切正常。
现在,我如何将python中的for loop
翻译为R,将查询结果附加到数据框中?
for row in cb.n1ql_query(query):
df = df.append(row, ignore_index=True)
我尝试使用reticulate::iterate()
,但它会引发错误。很可能是因为我没有正确使用这个功能。
> reticulate::iterate(cb$n1ql_query(query), print)
Error in reticulate::iterate(cb$n1ql_query(query), print) :
iterate function called with non-iterator argument
最后一种方法是使用rPython
包来直接调用python脚本,但即使这看起来也不是一个简单的任务。
任何有效的解决方案都可行。我不介意如何获得R数据帧。
非常感谢帮助:)