以编程方式提交带有代码隐藏的 U-SQL 作业
Programmatically submit a U-SQL job with code-behind
我目前正在通过 Python 库提交我的 U-SQL 作业,我想在 C# 或 Python 代码隐藏文件中添加其他代码。是否支持代码隐藏文件,无论是在 python 中还是在我可以轻松自动化的基于 CLI 的方法中?
理想情况下,我想使用 Azure CLI 或 Python 库,这样可以 运行 在 Linux 和 Windows 上(即不依赖 Visual Studio).我查看了 PowerShell 和 Python 的文档,但没有看到任何关于如何使用代码隐藏逻辑提交作业的说明。
这是我的 python 代码:
from azure.mgmt.datalake.analytics.job import DataLakeAnalyticsJobManagementClient
adlaJobClient = get_client_from_cli_profile(
DataLakeAnalyticsJobManagementClient,
adla_job_dns_suffix='azuredatalakeanalytics.net')
def submit_usql_job(script):
job_id = str(uuid.uuid4())
job_result = adlaJobClient.job.create(
ADLA_ACCOUNT_NAME,
job_id,
JobInformation(
name='Sample Job',
type='USql',
properties=USqlJobProperties(script=script)
)
)
print("Submitted job ID '{}'".format(job_id))
return job_id
作为您工作中的附加步骤,您可能必须自己管理创建和注册程序集。然后像往常一样引用程序集。如果您需要这可能是什么样子的示例,请提交来自 Visual Studio 的作业,以获得附带 code-behind 文件的查询,然后查看它为您生成的脚本。您会看到它正在为您透明地添加上述步骤。现在,您可以尝试在自己的代码中应用相同的 approach/pattern。
或者将您的 code-behind 逻辑移动到一个您可以单独上传和注册的专用库,one-time,然后将其引用到您 python-submitted 工作中的核心内容。
编译后,您的代码背后的 DLL 文件可以序列化为十六进制字符串,然后通过几行额外的代码内联导入。这样就避免了单独上传和注册DLL的需要。
CREATE ASSEMBLY [__TMP_inline_dll] FROM 0x4D5A900003000...;
WITH ADDITIONAL_FILES = (0x2A543C... AS "__TMP_inline_dll.pdb");
REFERENCE ASSEMBLY [__TMP_inline_dll];
/* Your USQL Code Here... */
DROP ASSEMBLY [__TMP_inline_dll];
可以使用此 Python 代码将文件序列化为十六进制:
import binascii
def get_file_hex_string(filepath: str):
"""Open file in binary mode and return as a hex string."""
with open(filepath, 'rb') as f:
hexdata = binascii.hexlify(f.read())
return hexdata.upper()
备注:
- 以上假定您已经编译了dll。
- 此样板代码包含一个标记为 "additional" 的 pdb 文件,该文件应该是可选的。
- "clean up" 之后的过程需要最后的
DROP ASSEMBLY
语句,尽管我被告知在未来的 USQL 版本中将不再需要此语句。
- 我通过非常有帮助的 VS Code USQL 插件支持团队收到了这个方法。
我目前正在通过 Python 库提交我的 U-SQL 作业,我想在 C# 或 Python 代码隐藏文件中添加其他代码。是否支持代码隐藏文件,无论是在 python 中还是在我可以轻松自动化的基于 CLI 的方法中?
理想情况下,我想使用 Azure CLI 或 Python 库,这样可以 运行 在 Linux 和 Windows 上(即不依赖 Visual Studio).我查看了 PowerShell 和 Python 的文档,但没有看到任何关于如何使用代码隐藏逻辑提交作业的说明。
这是我的 python 代码:
from azure.mgmt.datalake.analytics.job import DataLakeAnalyticsJobManagementClient adlaJobClient = get_client_from_cli_profile( DataLakeAnalyticsJobManagementClient, adla_job_dns_suffix='azuredatalakeanalytics.net') def submit_usql_job(script): job_id = str(uuid.uuid4()) job_result = adlaJobClient.job.create( ADLA_ACCOUNT_NAME, job_id, JobInformation( name='Sample Job', type='USql', properties=USqlJobProperties(script=script) ) ) print("Submitted job ID '{}'".format(job_id)) return job_id
作为您工作中的附加步骤,您可能必须自己管理创建和注册程序集。然后像往常一样引用程序集。如果您需要这可能是什么样子的示例,请提交来自 Visual Studio 的作业,以获得附带 code-behind 文件的查询,然后查看它为您生成的脚本。您会看到它正在为您透明地添加上述步骤。现在,您可以尝试在自己的代码中应用相同的 approach/pattern。
或者将您的 code-behind 逻辑移动到一个您可以单独上传和注册的专用库,one-time,然后将其引用到您 python-submitted 工作中的核心内容。
编译后,您的代码背后的 DLL 文件可以序列化为十六进制字符串,然后通过几行额外的代码内联导入。这样就避免了单独上传和注册DLL的需要。
CREATE ASSEMBLY [__TMP_inline_dll] FROM 0x4D5A900003000...;
WITH ADDITIONAL_FILES = (0x2A543C... AS "__TMP_inline_dll.pdb");
REFERENCE ASSEMBLY [__TMP_inline_dll];
/* Your USQL Code Here... */
DROP ASSEMBLY [__TMP_inline_dll];
可以使用此 Python 代码将文件序列化为十六进制:
import binascii
def get_file_hex_string(filepath: str):
"""Open file in binary mode and return as a hex string."""
with open(filepath, 'rb') as f:
hexdata = binascii.hexlify(f.read())
return hexdata.upper()
备注:
- 以上假定您已经编译了dll。
- 此样板代码包含一个标记为 "additional" 的 pdb 文件,该文件应该是可选的。
- "clean up" 之后的过程需要最后的
DROP ASSEMBLY
语句,尽管我被告知在未来的 USQL 版本中将不再需要此语句。 - 我通过非常有帮助的 VS Code USQL 插件支持团队收到了这个方法。