我正在探索Palantir Foundry平台,它似乎有大量用于矩形数据或结构化数据的选项。是否有人有在Foundry平台上处理非结构化大数据的经验?我们如何使用Foundry进行图像分析?
发布于 2020-10-02 23:40:29
尽管大多数示例都是使用表格数据给出的,但实际上很多用例都使用foundry来处理非结构化和半结构化数据。您应该将dataset视为一个包含文件的容器,其中包含用于访问和处理文件的API。使用文件级API,您可以访问数据集中的文件,并按自己的意愿处理它们。如果这些文件是图像,您可以从文件中提取信息并随意使用。一种常见的用例是将PDF作为数据集中的文件,并从PDF中提取信息并将其存储为表格信息,以便您可以对其进行结构化和非结构化搜索。
以下是提取PDF的文件访问示例:
import com.palantir.transforms.lang.java.api.Compute;
import com.palantir.transforms.lang.java.api.FoundryInput;
import com.palantir.transforms.lang.java.api.FoundryOutput;
import com.palantir.transforms.lang.java.api.Input;
import com.palantir.transforms.lang.java.api.Output;
import com.palantir.util.syntacticpath.Paths;
import com.google.common.collect.AbstractIterator;
import com.palantir.spark.binarystream.data.PortableFile;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.UUID;
import org.apache.spark.api.java.function.FlatMapFunction;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Encoders;
import org.apache.spark.sql.Row;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
public final class ExtractPDFText {
private static String pdf_source_files_rid = "SOME RID";
private static String dataProxyPath = "/foundry-data-proxy/api/dataproxy/datasets/";
private static String datasetViewPath = "/views/master/";
@Compute
public void compute(
@Input("/Base/project_name/treasury_pdf_docs") FoundryInput pdfFiles,
@Output("/Base/project_name/clean/pdf_text_extracted") FoundryOutput output) throws IOException {
Dataset<PortableFile> filesDataset = pdfFiles.asFiles().getFileSystem().filesAsDataset();
Dataset<String> mappedDataset = filesDataset.flatMap((FlatMapFunction<PortableFile, String>) portableFile ->
portableFile.convertToIterator(inputStream -> {
String pdfFileName = portableFile.getLogicalPath().getFileName().toString();
return new PDFIterator(inputStream, pdfFileName);
}), Encoders.STRING());
Dataset<Row> dataset = filesDataset
.sparkSession()
.read()
.option("inferSchema", "false")
.json(mappedDataset);
output.getDataFrameWriter(dataset).write();
}
private static final class PDFIterator extends AbstractIterator<String> {
private InputStream inputStream;
private String pdfFileName;
private boolean done;
PDFIterator(InputStream inputStream, String pdfFileName) throws IOException {
this.inputStream = inputStream;
this.pdfFileName = pdfFileName;
this.done = false;
}
@Override
protected String computeNext() {
if (done) {
return endOfData();
}
try {
String objectId = pdfFileName;
String appUrl = dataProxyPath.concat(pdf_source_files_rid).concat(datasetViewPath).concat(pdfFileName);
PDDocument document = PDDocument.load(inputStream);
PDFTextStripper pdfStripper = new PDFTextStripper();
String text = pdfStripper.getText(document);
String strippedText = text.replace("\"", "'").replace("\\", "").replace("“", "'").replace("”", "'").replace("\n", "").replace("\r", "");
done = true;
return "{\"id\": \"" + String.valueOf(UUID.randomUUID()) + "\", \"file_name\": \"" + pdfFileName + "\", \"app_url\": \"" + appUrl + "\", \"object_id\": \"" + objectId + "\", \"text\": \"" + strippedText + "\"}\n";
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
} 发布于 2020-10-30 18:16:06
实际上,您可以在Foundry上进行图像分析,因为您可以访问文件并可以使用任意库(例如,python的pillow或skimage )。这可以在规模上完成,也可以并行化。
一个简单的python代码片段将两张图片缝合在一起,应该可以让您开始使用:
from transforms.api import transform, Input, Output
from PIL import Image
@transform(
output=Output("/processed/stitched_images"),
raw=Input("/raw/images"),
image_meta=Input("/processed/image_meta")
)
def my_compute_function(raw, image_meta, output, ctx):
image_meta = image_meta.dataframe()
def stitch_images(clone):
left = clone["left_file_name"]
right = clone["right_file_name"]
image_name = clone["image_name"]
with raw.filesystem().open(left, mode="rb") as left_file:
with raw.filesystem().open(right, mode="rb") as right_file:
with output.filesystem().open(image_name, 'wb') as out_file:
left_image = Image.open(left_file)
right_image = Image.open(right_file)
(width, height) = left_image.size
result_width = width * 2
result_height = height
result = Image.new('RGB', (result_width, result_height))
result.paste(im=left_image, box=(0, 0))
result.paste(im=right_image, box=(height, 0))
result.save(out_file, format='jpeg', quality=90)
image_meta.rdd.foreach(stitch_images)image_meta数据集只是一个每行有2个文件名的数据集。要从原始文件的数据集中提取文件名,可以使用如下命令:
@transform(
output=Output("/processed/image_meta"),
raw=Input("/raw/images"),
)
def my_compute_function(raw, output, ctx):
file_names = [(file_status.path, 1) for file_status in raw.filesystem().ls(glob="*.jpg")]
# create and write spark dataframe based on array发布于 2021-04-16 13:34:42
正如其他人提到的那样,Palantir-Foundry的重点是表格数据,目前不提供GPU或其他张量处理单元访问。因此,在最好的情况下,如果不是完全不可能的话,做任何密集的事情,比如FFT变换或深度学习,都是不明智的。
也就是说,您可以将图像文件上传到dataset节点以进行读/写访问。您还可以将它们的二进制信息作为blob类型存储到Dataframe中,以便在给定的记录字段中存储文件。考虑到平台上有大量的Python图像处理相邻和矩阵数学库,并且还可以通过Code Repo应用程序手动将库包上传到平台,可以想象,只要不是过于复杂或占用大量内存,就可以在一定程度上使用简单的操作。
https://stackoverflow.com/questions/61889216
复制相似问题