python - 如何使用解析列作为时间戳将 csv 上传到 QuestDb?
问题描述
我想将 csv 文件导入具有指定时间戳列的 QuestDb 表中。我必须指定其中一列不是字符串,而是我作为的时间戳
import requests
schema = '[{"name":"date", "type": "Timestamp", "pattern":"yyyy-MM-dd"}]'
with open('..\HavCases.csv', 'rb') as f:
r = requests.post(r'http://localhost:9000/imp?name=table3&overwrite=true×tamp=date',
files={'schema': schema,'data': f})
print(r.text)
但日期列不断返回为 STRING 并且响应为
not a timestamp 'date'
当我×tamp
从 URL 中删除时,我看到列被解析为 STRING,而不是时间戳
+-----------------------------------------------------------------------------------------------------------------+
| Location: | table3 | Pattern | Locale | Errors |
| Partition by | NONE | | | |
| Timestamp | NONE | | | |
+-----------------------------------------------------------------------------------------------------------------+
| Rows handled | 780 | | | |
| Rows imported | 780 | | | |
+-----------------------------------------------------------------------------------------------------------------+
...
| 9 | date | STRING | 0 |
解决方案
我找到了一个答案,必须查看 QuestDb 源代码并非易事,因此将其发布在这里供其他人使用
显然,当 QuestDb 解析导入请求时,它希望 'schema' 文件在 csv 'data' 之前是第一个。当 Python 请求从文件 字典中发布数据时,它似乎按键的字母顺序发布它,因此files={'schema': schema,'data': f}
和files={'data': f, 'schema': schema}
是等价的,首先发送数据,然后发送模式。
为了解决这个问题,我必须提供 files 参数作为元组列表,而不是字典:
with open(r'..\HavCases.csv', 'rb') as f:
r = requests.post(r'http://localhost:9000/imp?name=table3&overwrite=true×tamp=date',
files=[('schema', schema), ('data', f)])
print(r.text)
推荐阅读
- html - 使用 .ts 代码在 Init 上过滤 PrimeNG 表
- go - 错误未定义:imagick.Initialize 使用 imagick
- java - 将String返回方法转换为List
Java中的返回方法 - tensorflow - TfLite 模型与量化前模型的不同结果
- c - 这个数字代表什么
- javascript - addEventListener 在 div 中滚动
- python - asyncio python的并发和并行性
- c# - 使用Newtonsoft在c#中将字符串转换为逗号分隔数组
- javascript - 无法在 Node 中使用 ndjson 流,但类似的代码在 React 中有效
- reactjs - 在 react-js 中将 props.image 设置为背景图像