我想从 R 中查询一个 couchbasedb 存储桶并将结果存储在数据框中。
我浏览了这篇博文并尝试使用自定义查询在我自己的集群中复制这些步骤,但在 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}}}]}
然后我尝试使用reticulate
R中的包来使用python SDK查询couchbasedb。
蟒蛇代码:
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 的失败尝试
代码:
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`')
到目前为止,一切正常。
现在,我如何将for loop
Python 中的转换为 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
package 直接调用 python 脚本,但这看起来也不是一个简单的任务。
任何可行的解决方案都可以。我不介意我们如何获得 R 数据框。
非常感谢您的帮助:)