Skip to content
Merged
13 changes: 13 additions & 0 deletions bigquery/bigframes/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@
# limitations under the License.

import os
import uuid

from google.cloud import bigquery
import pytest


Expand All @@ -25,3 +27,14 @@ def project_id() -> str:
@pytest.fixture(scope="session")
def location() -> str:
return "US"


@pytest.fixture(scope="session")
def dataset_id(project_id: str) -> str:
client = bigquery.Client(project=project_id)
dataset_id = f"bigframes_samples_{uuid.uuid4().hex[:8]}"
dataset = bigquery.Dataset(f"{project_id}.{dataset_id}")
dataset.location = "US"
client.create_dataset(dataset)
yield dataset_id
client.delete_dataset(dataset, delete_contents=True, not_found_ok=True)
44 changes: 44 additions & 0 deletions bigquery/bigframes/query_bqstorage.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# [START bigquery_bigframes_query_bqstorage]
import bigframes.pandas as bpd

import pandas as pd

# Set partial ordering mode as the default configuration for BigQuery
# DataFrames.
bpd.options.bigquery.ordering_mode = "partial"


def query_bqstorage() -> pd.DataFrame:
sql = """
SELECT name FROM `bigquery-public-data.usa_names.usa_1910_current`
WHERE state = 'TX'
LIMIT 100
"""

# Read query results into a server-side DataFrame without downloading data.
df = bpd.read_gbq(sql)

# When downloading results to an in-memory pandas DataFrame,
# bigquery-dataframes automatically uses the BigQuery Storage API if
# installed.
pandas_df = df.to_pandas()
return pandas_df
# [END bigquery_bigframes_query_bqstorage]


if __name__ == "__main__":
print(query_bqstorage())
20 changes: 20 additions & 0 deletions bigquery/bigframes/query_bqstorage_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import query_bqstorage


def test_query_bqstorage() -> None:
pandas_df = query_bqstorage.query_bqstorage()
assert pandas_df is not None
49 changes: 49 additions & 0 deletions bigquery/bigframes/query_parameters.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# [START bigquery_bigframes_query_parameters]
import bigframes.pandas as bpd

# Set partial ordering mode as the default configuration for BigQuery
# DataFrames.
bpd.options.bigquery.ordering_mode = "partial"


def query_parameters() -> bpd.DataFrame:
sql = """
SELECT name FROM `bigquery-public-data.usa_names.usa_1910_current`
WHERE state = @state
LIMIT 100
"""

query_config = {
"query": {
"parameterMode": "NAMED",
"queryParameters": [
{
"name": "state",
"parameterType": {"type": "STRING"},
"parameterValue": {"value": "TX"},
}
],
}
}

df = bpd.read_gbq(sql, configuration=query_config)
return df
# [END bigquery_bigframes_query_parameters]


if __name__ == "__main__":
print(query_parameters())
20 changes: 20 additions & 0 deletions bigquery/bigframes/query_parameters_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import query_parameters


def test_query_parameters() -> None:
df = query_parameters.query_parameters()
assert df is not None
46 changes: 46 additions & 0 deletions bigquery/bigframes/query_standard_sql.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# [START bigquery_bigframes_query]
import bigframes.pandas as bpd

# Set partial ordering mode as the default configuration for BigQuery
# DataFrames.
bpd.options.bigquery.ordering_mode = "partial"


def query_standard_sql(project_id: str = "your-project-id") -> bpd.DataFrame:
sql = """
SELECT name FROM `bigquery-public-data.usa_names.usa_1910_current`
WHERE state = 'TX'
LIMIT 100
"""

# Run a query alongside existing SQL. The project will be determined from
# default credentials.
df = bpd.read_gbq(sql)

# Run a query after explicitly specifying a project.
bpd.close_session()
bpd.options.bigquery.project = project_id
df = bpd.read_gbq(sql)
return df
# [END bigquery_bigframes_query]


if __name__ == "__main__":
import os

project = os.environ.get("GOOGLE_CLOUD_PROJECT", "your-project-id")
print(query_standard_sql(project_id=project))
20 changes: 20 additions & 0 deletions bigquery/bigframes/query_standard_sql_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import query_standard_sql


def test_query_standard_sql(project_id: str) -> None:
df = query_standard_sql.query_standard_sql(project_id=project_id)
assert df is not None
52 changes: 52 additions & 0 deletions bigquery/bigframes/upload_from_dataframe.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# [START bigquery_bigframes_upload_from_dataframe]
import bigframes.pandas as bpd

import pandas as pd

# Set partial ordering mode as the default configuration for BigQuery
# DataFrames.
bpd.options.bigquery.ordering_mode = "partial"


def upload_from_dataframe(
table_id: str = "your-project.your_dataset.your_table_name",
) -> bpd.DataFrame:
# Create a local pandas DataFrame.
df = pd.DataFrame(
{
"my_string": ["a", "b", "c"],
"my_int64": [1, 2, 3],
"my_float64": [4.0, 5.0, 6.0],
}
)

# Convert the local pandas DataFrame to a BigQuery DataFrame.
bq_df = bpd.read_pandas(df)

# Write the DataFrame to a BigQuery table.
bq_df.to_gbq(table_id, if_exists="replace")
return bq_df
# [END bigquery_bigframes_upload_from_dataframe]


if __name__ == "__main__":
import os

table_id = os.environ.get(
"TABLE_ID", "your-project.your_dataset.your_table_name"
)
print(upload_from_dataframe(table_id=table_id))
21 changes: 21 additions & 0 deletions bigquery/bigframes/upload_from_dataframe_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import upload_from_dataframe


def test_upload_from_dataframe(project_id: str, dataset_id: str) -> None:
table_id = f"{project_id}.{dataset_id}.upload_from_dataframe"
bq_df = upload_from_dataframe.upload_from_dataframe(table_id=table_id)
assert bq_df is not None