读取 txt 文件 JSON 数据以在 Cloud Pub Sub 中发布消息

Posted

技术标签:

【中文标题】读取 txt 文件 JSON 数据以在 Cloud Pub Sub 中发布消息【英文标题】:Read a txt file JSON data to publish the messages in Cloud Pub Sub 【发布时间】:2019-08-26 01:55:12 【问题描述】:

我正在尝试将数据发布到 Cloud Pub Sub。数据采用 JSON 格式,保存在我的本地文件夹中。我没有使用 Cloud Storage,而是尝试通过云功能直接读取 pubsub 消息。通过手动传递消息测试了流程,并且数据也被插入到 Bigquery 表中。我唯一卡住的地方是,我将如何将.txt 文件 JSON 数据集传递给 Cloud PubSub,

样本数据

"ID":6,"NAME":"Komal","AGE":22,"ADDRESS":"Assam","SALARY":20000

谁能给我一个提示!

我可以看到使用云存储的各种选项和所有选项,这里我从 DB 表中读取更改的数据,将这些记录插入到 1 个虚拟表中,并将该表中的数据转换为 JSON 格式并写入 .txt 文件.如果我可以从这里将数据发布到 pubsub,整个流程将完成

如果我像下面这样手动传递,数据将被插入

gcloud pubsub 主题发布 pubsubtopic1 --message

"ID":6,"NAME":"Komal","AGE":22,"ADDRESS":"Assam","SALARY":20000

4 月 10 日编辑

我如何使用批处理文件实现从 .txt 文件到 pubsub 的数据插入。但是当我从 PL SQL 过程(DBMS_SCHEDULER)调用批处理文件时,它会抛出错误“'gcloud' 未被识别为内部或外部命令”。但是当我从命令行调用批处理文件时,数据也被 psuhed 到 pub sub 和 Bigquery 表中。我正在使用的 PFB 脚本和 PL SQL 代码也是如此。任何帮助将不胜感激

用于调用脚本的批处理脚本和PL SQL代码

@echo off
set file=C:\temp\TEST_EXTRACT.txt
echo %file% >> C:\temp\T1.txt
for /f "tokens=*" %%A in (%file%) do (ECHO %%A >> C:\temp\T2.txt
ECHO cmd.exe /K cd C:\Users\test\AppData\Local\Google\Cloud SDK && gcloud pubsub topics publish pubsubtopic1 --message %%A > C:\temp\T3.txt)

Below mentioned the PL SQL code which is used for calling the batch file

BEGIN
SYS.DBMS_SCHEDULER.CREATE_JOB( 
    job_name => 'LOOP_JOB',
    job_type => 'EXECUTABLE',
    job_action => 'C:\WINDOWS\system32\cmd.exe',
    --repeat_interval => 'FREQ=WEEKLY;BYDAY=MON,TUE,WED,THU,FRI;  BYHOUR=18;BYMINUTE=0;BYSECOND=0',
    --start_date => SYSTIMESTAMP at time zone 'EUROPE/LONDON',
    job_class => 'DEFAULT_JOB_CLASS',
    comments => 'Job to test call out to batch script on Windows',
    auto_drop => FALSE,
    number_of_arguments => 3,
    enabled => FALSE);

SYS.DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE( 
    job_name => 'LOOP_JOB', argument_position => 1, argument_value => '/q'); 
SYS.DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE( 
    job_name => 'LOOP_JOB', argument_position => 2, argument_value => '/c'); 
SYS.DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE( 
    job_name => 'LOOP_JOB', argument_position => 3, argument_value => 'C:\temp\loop.bat'); 
SYS.DBMS_SCHEDULER.ENABLE( 'LOOP_JOB' ); 
END;
/

【问题讨论】:

您尝试使用哪种编程语言来执行此操作?还是您只想通过 gcloud 命令行工具严格执行? 嗨 Kamal Aboul-Hosn,语言不会有问题,因为我是通过云命令行测试的,所以想测试仅通过命令行发布的 .txt 文件数据集。基本上我想自动化这个过程.非常感谢这方面的任何帮助 是否需要通过 JSON 格式的文件?似乎有很多不必要的步骤。为什么不让从数据库表中读取更改数据的任何内容直接写入 Pub/Sub,而不是通过一个虚拟表,然后是一个 JSON 文件? 您的观点看起来绝对有效,但请建议我们是否可以直接从 DB 表数据以 JSON 格式写入 pubSub,因为我主要通过 PL/SQL 更新我的状态我提出的问题。请看一下。非常感谢任何帮助 【参考方案1】:

如果你想轻松发布单个文件的内容:

gcloud pubsub topics publish $PUBSUB_TOPIC_NAME --message "$(cat $FILE_NAME | jq -c)"

【讨论】:

【参考方案2】:

您的 bash 脚本的问题可能是 gcloud 命令行工具未安装在数据库实际运行的机器上,或者不在运行脚本的环境的 PATH 中,因此当您的 . bat 脚本运行。

话虽如此,我强烈建议不要尝试在 .bat 脚本中进行数据处理并将其传递给命令行工具,因为它很容易出错,并且会因效率低下而产生大量开销JSON 编码,以及为每条消息启动和拆除发布者客户端。相反,我建议您改为以 CSV 格式导出数据,并使用 client libraries 之一来读取此文件并发布到 Cloud Pub/Sub。正如您在下面提到的,这仍然可以从数据库 cron 作业中触发,并且效率更高且可测试性更高。

【讨论】:

【参考方案3】:

如果您在文件中获得的 Json 数据是一个数组,那么您可以使用以下命令将该数组的每个条目发布到主题:

jq -c ".[]" json_array.json | xargs -t -I  gcloud pubsub topics publish yourTopic --message 

确保您安装了jq,而xargs 更常见。

【讨论】:

以上是关于读取 txt 文件 JSON 数据以在 Cloud Pub Sub 中发布消息的主要内容,如果未能解决你的问题,请参考以下文章

绕过内存错误以在 Python 中读取大型 JSON 文件 [关闭]

PySpark 从目录中读取多个 txt 文件为 json 格式

js读取本地txt文件中的json数据

angularjs中的$ http.get读取txt文件但无法读取json文件

解析错误:遵循 Firebase Cloud Functions 初始化说明后无法读取文件 '\tsconfig.json' eslint

深度学习数据txt转json