diff --git a/pandas_gbq/gbq.py b/pandas_gbq/gbq.py index b9bb9498..487174f4 100644 --- a/pandas_gbq/gbq.py +++ b/pandas_gbq/gbq.py @@ -1079,8 +1079,11 @@ def _generate_bq_schema(df, default_type='STRING'): fields = [] for column_name, dtype in df.dtypes.iteritems(): - fields.append({'name': column_name, - 'type': type_mapping.get(dtype.kind, default_type)}) + definition = {'name': column_name, + 'type': type_mapping.get(dtype.kind, default_type)} + if isinstance(getattr(df, column_name)[0], list): + definition['mode'] = 'REPEATED' + fields.append(definition) return {'fields': fields} diff --git a/pandas_gbq/tests/test_gbq.py b/pandas_gbq/tests/test_gbq.py index e8eda1d3..8cade975 100644 --- a/pandas_gbq/tests/test_gbq.py +++ b/pandas_gbq/tests/test_gbq.py @@ -1091,6 +1091,18 @@ def test_generate_schema(self): assert schema == test_schema + def test_generate_repeated_schema(self): + df = DataFrame([{'A': [1, 2, 3], 'B': ['1', '2']}, + {'A': [3, 5], 'B': ['8', '3']}]) + schema = gbq._generate_bq_schema(df) + + test_schema = {'fields': [ + {'name': 'A', 'type': 'INTEGER', 'mode': 'REPEATED'}, + {'name': 'B', 'type': 'STRING', 'mode': 'REPEATED'} + ]} + + assert schema == test_schema + def test_create_table(self): test_id = "6" schema = gbq._generate_bq_schema(tm.makeMixedDataFrame())