我尝试使用带有shell命令活动的弹性数据管道来处理一些数据文件。具体来说,我试图使用python来处理一些分阶段的数据。
我对python脚本的第一次尝试看起来像:
#!/usr/bin/env python
import os
print "We've entered the python file"
print os.curdir
print os.listdir(os.curdir)
print ${INPUT1_STAGING_DIR}
由于$ {INPUT1_STAGING_DIR}未定义,因此当第四个print语句被命中时,此代码引发错误。
之后,我尝试将$ {INPUT1_STAGING_DIR}作为参数传递给脚本,并将脚本修改为:
#!/usr/bin/env python
import os
import sys
print "We've entered the python file"
print os.curdir
print os.listdir(os.curdir)
print sys.argv
这次脚本成功完成并具有以下输出。
We've entered the python file . ['taskRunner.zip', 'mysql-connector-java-bin.jar', 'csv-serde.jar', 'run.sh', 'TaskRunner-1.0.jar', 'pipeline-serde.jar', 'run.out', 'output'] ['/mnt/taskRunner/output/tmp/ActivityIdQC6BK20140722T170548Attempt1_command.sh', '${INPUT1_STAGING_DIR}']
同样,$ {INPUT1_STAGING_DIR}未被替换"对于任何类似于我正在进行的文件的事情。我试图做的是什么?如果没有,是否有一个好的解决方法?
答案 0 :(得分:4)
事实证明$ {INPUT1_STAGING_DIR}被设置为环境变量,可以这样访问。以下脚本适用于我:
#!/usr/bin/python
import os
import sys
print "We've entered the python file"
print os.curdir
print os.listdir(os.curdir)
inputDir = os.getenv('INPUT1_STAGING_DIR')
print inputDir
print os.path.isfile(inputDir)
print os.path.isdir(inputDir)
print os.listdir(inputDir)
答案 1 :(得分:1)
你必须设置Stage = true。此选项作为ShellCommandActivity活动中的下拉字段提供。
具体引用文档: http://docs.aws.amazon.com/datapipeline/latest/DeveloperGuide/dp-concepts-staging.html
在资源上本地暂存数据 输入数据自动复制到资源本地文件系统中。输出数据自动从资源本地文件系统复制到输出数据节点。例如,当您使用staging = true配置ShellCommandActivity输入和输出时,输入数据可用作INPUTx_STAGING_DIR,输出数据可用作OUTPUTx_STAGING_DIR,其中x是输入或输出的数量。
希望这能解决您的原始问题。