Мы пытаемся построить конвейер, который принимает данные из BigQuery, проходит через TensorFlow Transform, перед обучением в TensorFlow.
Конвейер запущен и работает, но у нас возникают проблемы с нулевыми значениями в BigQuery.
Мы используем Beam для загрузки из BigQuery:
raw_data = (pipeline
| '{}_read_from_bq'.format(step) >> beam.io.Read(
beam.io.BigQuerySource(query=source_query,
use_standard_sql=True,
)))
Я играю с метаданными набора данных, пробуя FixedLenFeature
и VarLenFeature
для различных столбцов:
# Categorical feature schema
categorical_features = {
column_name: tf.io.FixedLenFeature([], tf.string) for column_name in categorical_columns
}
raw_data_schema.update(categorical_features)
# Numerical feature schema
numerical_features = {
column_name: tf.io.VarLenFeature(tf.float32) for column_name in numerical_columns
}
raw_data_schema.update(numerical_features)
# Create dataset_metadata given raw_data_schema
raw_metadata = dataset_metadata.DatasetMetadata(
schema_utils.schema_from_feature_spec(raw_data_schema))
Как и ожидалось, если вы попытаетесь передать BigQuery NULL в FixedLenFeature
, он сломается.
Однако, когда я попытаюсь передать строки или целые числа в VarLenFeature
, он сломается тоже. Это происходит потому, что VarLenFeature ожидает список, но BigQuerySource дает Python примитив. Точная точка, где он ломается, находится здесь (ошибка возникла из-за того, что я попытался с целым числом):
File "/usr/local/lib/python3.7/site-packages/tensorflow_transform/impl_helper.py", line 157, in <listcomp>
indices = [range(len(value)) for value in values]
TypeError: object of type 'int' has no len()
[while running 'train_transform/AnalyzeDataset/ApplySavedModel[Phase0]/ApplySavedModel/ApplySavedModel']
Когда я пытаюсь использовать VarLenFeature со своими строковыми входами, например, «UK», выводом является SparseTensor, подобный этому :
SparseTensorValue(indices=[(0, 0), (0, 1)], values=['U', 'K'], dense_shape=(1, 2))
Похоже, мне нужно передать список в VarLenFeature, чтобы это работало, но BigQuerySource не делает этого по умолчанию.
Существует ли простой способ достижения это? Или я полностью теряю оценку при чтении пустых столбцов в BigQuery?
Заранее большое спасибо!