Учитывая набор данных, как показано ниже
{"slot":"reward","result":1,"rank":1,"isLandscape":false,"p_type":"main","level":1276,"type":"ba","seqNum":42544}
{"slot":"reward_dlg","result":1,"rank":1,"isLandscape":false,"p_type":"main","level":1276,"type":"ba","seqNum":42545}
...more type json data here
Я пытаюсь отфильтровать эти данные json и вставить их в bigquery с python sdk следующим образом
ba_schema = 'slot:STRING,result:INTEGER,play_type:STRING,level:INTEGER'
class ParseJsonDoFn(beam.DoFn):
B_TYPE = 'tag_B'
def process(self, element):
text_line = element.trip()
data = json.loads(text_line)
if data['type'] == 'ba':
ba = {'slot': data['slot'], 'result': data['result'], 'p_type': data['p_type'], 'level': data['level']}
yield pvalue.TaggedOutput(self.B_TYPE, ba)
def run():
parser = argparse.ArgumentParser()
parser.add_argument('--input',
dest='input',
default='data/path/data',
help='Input file to process.')
known_args, pipeline_args = parser.parse_known_args(argv)
pipeline_args.extend([
'--runner=DirectRunner',
'--project=project-id',
'--job_name=data-job',
])
pipeline_options = PipelineOptions(pipeline_args)
pipeline_options.view_as(SetupOptions).save_main_session = True
with beam.Pipeline(options=pipeline_options) as p:
lines = p | ReadFromText(known_args.input)
multiple_lines = (
lines
| 'ParseJSON' >> (beam.ParDo(ParseJsonDoFn()).with_outputs(
ParseJsonDoFn.B_TYPE)))
b_line = multiple_lines.tag_B
(b_line
| "output_b" >> beam.io.WriteToBigQuery(
'temp.ba',
schema = B_schema,
write_disposition = beam.io.BigQueryDisposition.WRITE_TRUNCATE,
create_disposition = beam.io.BigQueryDisposition.CREATE_IF_NEEDED
))
И в журналах отладки показано
INFO:root:finish <DoOperation output_b/WriteToBigQuery output_tags=['out'], receivers=[ConsumerSet[output_b/WriteToBigQuery.out0, coder=WindowedValueCoder[FastPrimitivesCoder], len(consumers)=0]]>
DEBUG:root:Successfully wrote 2 rows.
Похоже, эти две данные с type:ba
были вставлены в таблицу больших запросов temp.ba
.Тем не менее, я запускаю
select * from `temp.ba` limit 100;
В этой таблице нет данных temp.ba
.
Что-то не так с моими кодами или я что-то пропустил?
Обновление :
Спасибо, ответ @Eric Schmidt, я знаю, что могут быть некоторые задержки для исходных данных.Однако через 5 минут после запуска вышеуказанного сценария в таблице еще нет данных .
Когда я пытаюсьудалить write_disposition = beam.io.BigQueryDisposition.WRITE_TRUNCATE
в BigQuerySink
| "output_b" >> beam.io.Write(
beam.io.BigQuerySink(
table = 'ba',
dataset = 'temp',
project = 'project-id',
schema = ba_schema,
#write_disposition = beam.io.BigQueryDisposition.WRITE_TRUNCATE,
create_disposition = beam.io.BigQueryDisposition.CREATE_IF_NEEDED
)
))
Эти две записи могут быть найдены немедленно.
А информация таблицы
Возможно, я не улавливаю значение лаг доступности исходных данных еще.Может ли кто-нибудь дать мне больше информации?