python - 将 API JSON 数据发送到 Exasol DB 表
问题描述
我正在使用来自虚拟 JSON 站点的假 JSON 数据,如下所示:
[
{
"postId": 1,
"id": 1,
"name": "id labore ex et quam laborum",
"email": "Eliseo@gardner.biz",
"body": "laudantium enim quasi est quidem magnam voluptate ipsam eos\ntempora quo necessitatibus\ndolor quam autem quasi\nreiciendis et nam sapiente accusantium"
},
{
"postId": 1,
"id": 2,
"name": "quo vero reiciendis velit similique earum",
"email": "Jayne_Kuhic@sydney.com",
"body": "est natus enim nihil est dolore omnis voluptatem numquam\net omnis occaecati quod ullam at\nvoluptatem error expedita pariatur\nnihil sint nostrum voluptatem reiciendis et"
}
]
我通过库读取 API 数据,requests
然后转身将其发送到 Exasol DB 表中。请参阅下面的代码
import requests
import pyexasol
def get_api_data():
r = requests.get("http://jsonplaceholder.typicode.com/comments")
data = r.json()
return data
def connection():
session = pyexasol.connect_local_config('my_exasol')
return session
def send_api_data():
s = connection()
data = get_api_data()
for row in data:
s.execute("""INSERT INTO TESTBED.TEST_API(postId, id, name, email, body) VALUES ({postId}, {id},{name},
{email}, {body})""", {'postId': row['postId'], 'id': row['id'], 'name': row['name'], 'email': row['email'],
'body': row['body']})
send_api_data()
这工作正常,问题是它非常慢。插入 500 条记录大约需要 2 分钟。我知道必须有一种更有效的方法来做到这一点。实际上,我将从一个包含数千条记录的 API 中提取数据,我希望将这些记录转过来并发送到数据库表中。
关于采取更好方法的任何想法?
解决方案
在 Exasol 中执行单个插入语句很慢,因为它是基于列的数据库。您应该改用IMPORT。确保也阅读 pyexasol 的最佳实践。还要考虑启用压缩。
对于您的示例,请尝试以下操作。以我为例,导入数据需要 0.7 秒。
import requests
import pyexasol
import pandas
import time
def get_api_data():
r = requests.get("http://jsonplaceholder.typicode.com/comments")
data = r.json()
return data
def connection():
session = pyexasol.connect_local_config('my_exasol')
return session
def send_api_data():
s = connection()
data = get_api_data()
data_for_import = [(row['postId'], row['id'], row['name'], row['email'], row['body']) for row in data]
start = time.time()
s.import_from_iterable(data_for_import, ("TESTBED","TEST_API"))
print("Finished import after ", time.time() - start, " seconds")
send_api_data()
推荐阅读
- ruby - RVM 通过 repo 文件自动检测 Ruby 版本的功能在 VSCode 登录 shell 终端中不起作用
- java - 实现自定义注解
- javascript - 如何重写这个双箭头函数
- c# - Stackify 不在 ASP.NET Core 中使用代理
- java - 如何使用两个列表对 recyclerview 进行分页
- unity3d - Unity:玩家跳得很好,但下落非常慢
- python - 写入文件时打印到控制台的数字
- amazon-s3 - Amazon S3 SelectObjectContent 错误 - OverMaxParquetBlockSize
- php - 无法检索要在页面上发布的访问令牌
- javascript - 在对象javascript数组中插入对象