dks*_*551 5 python sorting bash json jq
要求:我有一个 .gz 格式的 Json 文件。因此,当它被压缩时,它的大小约为 500 MB。当我提取它时,json 文件变得接近约 10 GB。提取的 JSON 文件逐行包含单个 JSON 对象。我想要的是ps使用任何 bash 脚本或 python 程序根据字段对文件进行排序。
由于文件太大,不建议将其加载到内存中。因此,我使用 gzcat 和 cat bash 命令来流式传输 JSON 数据,然后将它们通过管道传输到 jq 以进行排序。但是系统在此过程中没有响应,或者我在 output.json 中得到了空文件
>cat sth2.json | parallel --pipe --group --block 1000M --recend '\n}\n' "jq -s -c 'sort_by(.ps) | .[]'" > "output.json"
>gzcat sth2.json.gz | parallel --pipe --group --block 1000M --recend '\n}\n' "jq -s -c 'sort_by(.ps) | .[]'" > "output.json"
Run Code Online (Sandbox Code Playgroud)
硬件:16GB 内存,核心 i5 处理器
示例 JSON 数据:-
{
"ps":"abc"
....
}
{
"ps":"def"
......
}
{
"ps":"abc"
....
}
Run Code Online (Sandbox Code Playgroud)
预期输出:
{
"ps":"abc"
....
}
{
"ps":"abc"
....
}
{
"ps":"def"
....
}
Run Code Online (Sandbox Code Playgroud)
我不明白我做错了什么。谁能建议如何对如此庞大的 JSON 文件进行排序?我关注的链接:https : //github.com/joelpurra/jq-hopkok/tree/master/src/parallelism
另外,在没有 Hadoop 的情况下,我可以通过任何 Map Reduce 做什么吗?
方法 1:将数据流式传输到本地 Sqlite DB。
import sqlite3
import fileinput
PATH=".../sqlite-snapshot-201904101324/testDB.db"
insert_query="INSERT INTO feeds (data) VALUES (?)"
def db_connect(db_path=PATH):
con = sqlite3.connect(db_path)
return con
con = db_connect() # connect to the database
cur = con.cursor() # instantiate a cursor obj
record_count = 0
for line in fileinput.input():
cur.execute(insert_query,(line,))
Run Code Online (Sandbox Code Playgroud)
命令行:
>gzcat sth.json.gz | python insert.py
Run Code Online (Sandbox Code Playgroud)
这是基于其中一条评论中的建议的一种解决方案:
例如,如果您可以使用排序键为行添加前缀,以便它们可以作为文本而不是 JSON 进行排序,那么 GNU sort 可以轻松地对 10GB 以上的文件进行排序,而无需将它们加载到内存中。– 另一个人
您可以使用 jq 按照以下方式执行此操作:
jq -cr '"\(.ps)\t\(.)"'
Run Code Online (Sandbox Code Playgroud)
这将生成带有制表符分隔值的行,如下所示:
abc {"ps":"abc","x":0}
abc {"ps":"abc","x":1}
Run Code Online (Sandbox Code Playgroud)
使用 -c 选项可确保将每一对(即排序键和对象)写入一行。
现在您可以轻松地对行进行排序,例如使用sort; 然后使用例如cut剥离 .ps 字段。
最后,如果你真的想要格式化输出,你可以再次使用jq(例如jq .),重点是 jq 在默认情况下是面向流的。
以上假设 .ps 值是无标签的。如果不是这种情况,那么您可以使用不同的字段分隔符,或者:
jq -cr '([.ps] | @tsv) + "\t" + tostring'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1327 次 |
| 最近记录: |