我需要读取google dataflow中的二进制文件, 我只需要读取文件并将每个64字节解析为一条记录,然后对数据流中二进制文件的每个64字节的每个字节应用一些逻辑。
我在spark中尝试过的东西,代码如下:
def main(args: Array[String]): Unit = {
val spark = SparkSession
.builder()
.appName("RecordSplit")
.master("local[*]")
.getOrCreate()
val df = spark.sparkContext.binaryRecords("< binary-file-path>", 64)
val Table = df.map(rec => {
val c1= (convertHexToString(rec(0)))
val c2= convertBinaryToInt16(rec, 48)
val c3= rec(59)
val c4= convertHexToString(rec(50)) match {
case str =>
if (str.startsWith("c"))
2020 + str.substring(1).toInt
else if (str.startsWith("b"))
2010 + str.substring(1).toInt
else if (str.startsWith("b"))
2000 + str.substring(1).toInt
case _ => 1920
}
答案 0 :(得分:0)
我建议以下内容:
如果您不限于python / scala,OffsetBasedSource(FileBasedSource是子类)可以满足您的需求,因为它使用偏移量来定义开始和结束位置。
TikaIO可以处理元数据,但是可以根据文档读取二进制数据。
示例dataflow-opinion-analysis包含从任意字节位置读取的信息。
还有其他文档可用于创建自定义Read implementation。您可能需要考虑查看这些Beam examples,以获取有关如何实现自定义来源(如python example)的指南。
一种不同的方法是在流水线外(内存中)创建一个64字节的数组,然后创建一个PCollection from memory,只需记住文档建议将其用于单元测试。