python—为什么在解析从spark dataframe编写的tfrecord文件中的字节字符串时不能解析所有数据?

5m1hhzi4  于 2021-07-14  发布在  Spark
关注(0)|答案(0)|浏览(260)

赏金6天后到期。回答此问题可获得+50声望奖励。datajack想引起更多的注意**这个问题。

我使用spark tensorflow连接器包编写了一个tfrecord数据集。
尝试将中的tfrecord文件作为中的tfrecorddataset读取时,将丢失包含数组数组的所有字段(在我的示例中,这是“cold”)。
重新创建的步骤
进行Spark会话,包括Spark张流连接器
创建包含嵌套数组列的示例数据框。

from pyspark.sql.types import *

data = [("A", 1, [1.1,2.0,3.0], [[0.0,1.0],[1.0,0.0]]),
         ("B", 2, [11.0,12.3,13.0], [[0.0,1.0],[1.0,0.0]]),
         ("C", 3, [21.0,22.0,23.5], [[1.0,0.0],[1.0,0.0]]),
  ]

schema = StructType([ \
    StructField("colA",StringType(),True), \
    StructField("colb",IntegerType(),True), \
    StructField("colc",ArrayType(FloatType()),True), \
    StructField("cold",ArrayType(ArrayType(FloatType())),True), \
  ])

df = spark.createDataFrame(data=data,schema=schema)

将df作为tfrecord写入磁盘。

write_path = "/home/ec2-user/SageMaker/testwrite/test.tfrecord"

df.write.format("tfrecords").option("recordType", "SequenceExample").mode("overwrite").save(write_path)

尝试使用tf.data.tfrecorddataset读入

import tensorflow as tf
import os 

files = [f"{write_path}/{x}" for x in os.listdir(write_path) if x.startswith("part")]
dataset = tf.data.TFRecordDataset(files)

for i in dataset.take(1):
    print(repr(i))
    example = tf.train.Example()
    example.ParseFromString(i.numpy())
    print(example)

即使 print(repr(i)) 显示numpy bytestring中存在“cold”。

<tf.Tensor: id=55, shape=(), dtype=string, numpy=b'\n8\n\r\n\x04colA\x12\x05\n\x03\n\x01C\n\r\n\x04colb\x12\x05\x1a\x03\n\x01\x03\n\x18\n\x04colc\x12\x10\x12\x0e\n\x0c\x00\x00\xa8A\x00\x00\xb0A\x00\x00\xbcA\x12&\n$\n\x04cold\x12\x1c\n\x0c\x12\n\n\x08\x00\x00\x80?\x00\x00\x00\x00\n\x0c\x12\n\n\x08\x00\x00\x80?\x00\x00\x00\x00'>
``` `example.ParseFromString` 不分析数据:(

features {
feature {
key: "colA"
value {
bytes_list {
value: "C"
}
}
}
feature {
key: "colb"
value {
int64_list {
value: 3
}
}
}
feature {
key: "colc"
value {
float_list {
value: 21.0
value: 22.0
value: 23.5
}
}
}
}

我没有成功使用 `tf.io.parse_single_example` 任何一个。我可以将所有嵌套数组分解为各自的字段,但不希望这样,因为我只会在tensorflow中再次合并它们。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题