使用 palantir foundry 中的存储库输出 .docx 文档
Output .docx document using repository in palantir foundry
由于铸造厂文档相当零散,并没有真正提供答案:
是否可以以某种方式使用铸造代码存储库(python-docx 库可用并已使用)和 df 作为输入来生成 word 文档 (.docx) 作为输出?
我认为也许使用 transform input/output 和 py-docx document.save() 功能的组合可能有效,但我想不出合适的解决方案。
from pyspark.sql import functions as F
from transforms.api import transform, transform_df, Input, Output
import os, docx
import pandas as pd
@transform(
output = Output("some_folder/"),
source_df = Input(""),
)
def compute(source_df, output):
df = source_df.dataframe()
test = df.toPandas()
document = docx.Document()
doc.add_paragraph(str(test.loc[1,1])
document.save('test.docx')
output.write_dataframe(df)
此代码 ofc 不起作用,但希望有一个可行的解决方案(在理想情况下,可能会有多个 .docx 作为输出)。
最好的办法是使用 spark 将文件生成分发给执行程序。此转换为每一行生成一个 word 文档并存储在数据集容器中,建议使用 Compass(Foundry 的文件夹系统)。浏览到数据集以下载基础文件
# from pyspark.sql import functions as F
from transforms.api import transform, Output
import pandas as pd
import docx
'''
# ====================================================== #
# === [DISTRIBUTED GENERATION OF FILESYSTEM OUTPUTS] === #
# ====================================================== #
Description
-----------
Generates a spark dataframes containing docx files with strings contained in a source spark dataframe
Strategy
--------
1. Create dummy spark dataframe with primary key and random text
2. Use a udf to open filesystem and write a docx with the contents of text column above
'''
@transform(
output=Output("ri.foundry.main.dataset.7e0f243f-e97f-4e05-84b3-ebcc4b4a2a1c")
)
def compute(ctx, output):
# gen data
pdf = pd.DataFrame({'name': ['docx_1', 'docx_2'], 'content': ['doc1 content', 'doc2 content']})
data = ctx.spark_session.createDataFrame(pdf)
# function to write files
def strings_to_doc(df, transform_output):
rdd = df.rdd
def generate_files(row):
filename = row['name'] + '.docx'
with transform_output.filesystem().open(filename, 'wb') as worddoc:
doc = docx.Document()
doc.add_heading(row['name'])
doc.add_paragraph(row['content'])
doc.save(worddoc)
rdd.foreach(generate_files)
return strings_to_doc(data, output)
如果您更喜欢 pandas 数据框的输入,pandas udf 也可以工作,但您被迫定义一个不方便您使用的模式。
由于铸造厂文档相当零散,并没有真正提供答案: 是否可以以某种方式使用铸造代码存储库(python-docx 库可用并已使用)和 df 作为输入来生成 word 文档 (.docx) 作为输出? 我认为也许使用 transform input/output 和 py-docx document.save() 功能的组合可能有效,但我想不出合适的解决方案。
from pyspark.sql import functions as F
from transforms.api import transform, transform_df, Input, Output
import os, docx
import pandas as pd
@transform(
output = Output("some_folder/"),
source_df = Input(""),
)
def compute(source_df, output):
df = source_df.dataframe()
test = df.toPandas()
document = docx.Document()
doc.add_paragraph(str(test.loc[1,1])
document.save('test.docx')
output.write_dataframe(df)
此代码 ofc 不起作用,但希望有一个可行的解决方案(在理想情况下,可能会有多个 .docx 作为输出)。
最好的办法是使用 spark 将文件生成分发给执行程序。此转换为每一行生成一个 word 文档并存储在数据集容器中,建议使用 Compass(Foundry 的文件夹系统)。浏览到数据集以下载基础文件
# from pyspark.sql import functions as F
from transforms.api import transform, Output
import pandas as pd
import docx
'''
# ====================================================== #
# === [DISTRIBUTED GENERATION OF FILESYSTEM OUTPUTS] === #
# ====================================================== #
Description
-----------
Generates a spark dataframes containing docx files with strings contained in a source spark dataframe
Strategy
--------
1. Create dummy spark dataframe with primary key and random text
2. Use a udf to open filesystem and write a docx with the contents of text column above
'''
@transform(
output=Output("ri.foundry.main.dataset.7e0f243f-e97f-4e05-84b3-ebcc4b4a2a1c")
)
def compute(ctx, output):
# gen data
pdf = pd.DataFrame({'name': ['docx_1', 'docx_2'], 'content': ['doc1 content', 'doc2 content']})
data = ctx.spark_session.createDataFrame(pdf)
# function to write files
def strings_to_doc(df, transform_output):
rdd = df.rdd
def generate_files(row):
filename = row['name'] + '.docx'
with transform_output.filesystem().open(filename, 'wb') as worddoc:
doc = docx.Document()
doc.add_heading(row['name'])
doc.add_paragraph(row['content'])
doc.save(worddoc)
rdd.foreach(generate_files)
return strings_to_doc(data, output)
如果您更喜欢 pandas 数据框的输入,pandas udf 也可以工作,但您被迫定义一个不方便您使用的模式。