我已经从Dataprep导出了Cloud Dataflow模板,如下所示:
https://cloud.google.com/dataprep/docs/html/Export-Basics_57344556
在Dataprep中,该流程通过通配符从Google Cloud Storage提取文本文件,转换数据,并将其附加到现有的BigQuery表中。所有工作都按预期进行。
但是,当尝试从导出的模板启动Dataflow作业时,我似乎无法正确获取启动参数。错误消息不是太具体,但是很明显,我并没有正确定位位置(输入和输出)。
此用例唯一的Google提供的模板(位于https://cloud.google.com/dataflow/docs/guides/templates/provided-templates#cloud-storage-text-to-bigquery)不适用,因为它使用UDF并以批处理模式运行,覆盖了任何现有的BigQuery表,而不是追加。
从Dataprep检查原始的Dataflow作业详细信息会显示许多参数(在元数据文件中找到),但我无法使其在我的代码中正常工作。这是一个失败的配置示例:
import time
from google.cloud import storage
from googleapiclient.discovery import build
from oauth2client.client import GoogleCredentials
def dummy(event, context):
pass
def process_data(event, context):
credentials = GoogleCredentials.get_application_default()
service = build('dataflow', 'v1b3', credentials=credentials)
data = event
gsclient = storage.Client()
file_name = data['name']
time_stamp = time.time()
GCSPATH="gs://[path to template]
BODY = {
"jobName": "GCS2BigQuery_{tstamp}".format(tstamp=time_stamp),
"parameters": {
"inputLocations" : '{{\"location1\":\"[my bucket]/{filename}\"}}'.format(filename=file_name),
"outputLocations": '{{\"location1\":\"[project]:[dataset].[table]\", [... other locations]"}}',
"customGcsTempLocation": "gs://[my bucket]/dataflow"
},
"environment": {
"zone": "us-east1-b"
}
}
print(BODY["parameters"])
request = service.projects().templates().launch(projectId=PROJECT, gcsPath=GCSPATH, body=BODY)
response = request.execute()
print(response)
上面的示例指示无效的字段(“ location1”,我从完成的Dataflow作业中提取了该字段。我知道我需要指定GCS位置,模板位置和BigQuery表,但在任何地方都找不到正确的语法如上所述,我在作业的生成的元数据文件中找到了字段名称和样本值。
我意识到这个特定的用例可能不会敲响警钟,但是总的来说,如果有人成功地确定并使用了正确的启动参数来处理从Dataprep导出的Dataflow作业,我将不胜感激。谢谢。