Skip to content

Instantly share code, notes, and snippets.

@alasarr
Created March 6, 2022 09:37
Show Gist options
  • Save alasarr/253ccf569cb824a1c27369c5203c7072 to your computer and use it in GitHub Desktop.
Save alasarr/253ccf569cb824a1c27369c5203c7072 to your computer and use it in GitHub Desktop.
GeoParquet BigQuery
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/alasarr/253ccf569cb824a1c27369c5203c7072/geoparquet-bigquery.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "code",
"source": [
"!pip install geopandas"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "Cirb5qI1gcq8",
"outputId": "64acbe07-0908-4067-ba74-682f2fbc9b9b"
},
"execution_count": 1,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Collecting geopandas\n",
" Downloading geopandas-0.10.2-py2.py3-none-any.whl (1.0 MB)\n",
"\u001b[K |████████████████████████████████| 1.0 MB 5.4 MB/s \n",
"\u001b[?25hCollecting fiona>=1.8\n",
" Downloading Fiona-1.8.21-cp37-cp37m-manylinux2014_x86_64.whl (16.7 MB)\n",
"\u001b[K |████████████████████████████████| 16.7 MB 186 kB/s \n",
"\u001b[?25hCollecting pyproj>=2.2.0\n",
" Downloading pyproj-3.2.1-cp37-cp37m-manylinux2010_x86_64.whl (6.3 MB)\n",
"\u001b[K |████████████████████████████████| 6.3 MB 38.4 MB/s \n",
"\u001b[?25hRequirement already satisfied: pandas>=0.25.0 in /usr/local/lib/python3.7/dist-packages (from geopandas) (1.3.5)\n",
"Requirement already satisfied: shapely>=1.6 in /usr/local/lib/python3.7/dist-packages (from geopandas) (1.8.1.post1)\n",
"Requirement already satisfied: setuptools in /usr/local/lib/python3.7/dist-packages (from fiona>=1.8->geopandas) (57.4.0)\n",
"Collecting munch\n",
" Downloading munch-2.5.0-py2.py3-none-any.whl (10 kB)\n",
"Requirement already satisfied: certifi in /usr/local/lib/python3.7/dist-packages (from fiona>=1.8->geopandas) (2021.10.8)\n",
"Collecting click-plugins>=1.0\n",
" Downloading click_plugins-1.1.1-py2.py3-none-any.whl (7.5 kB)\n",
"Requirement already satisfied: attrs>=17 in /usr/local/lib/python3.7/dist-packages (from fiona>=1.8->geopandas) (21.4.0)\n",
"Requirement already satisfied: six>=1.7 in /usr/local/lib/python3.7/dist-packages (from fiona>=1.8->geopandas) (1.15.0)\n",
"Requirement already satisfied: click>=4.0 in /usr/local/lib/python3.7/dist-packages (from fiona>=1.8->geopandas) (7.1.2)\n",
"Collecting cligj>=0.5\n",
" Downloading cligj-0.7.2-py3-none-any.whl (7.1 kB)\n",
"Requirement already satisfied: pytz>=2017.3 in /usr/local/lib/python3.7/dist-packages (from pandas>=0.25.0->geopandas) (2018.9)\n",
"Requirement already satisfied: numpy>=1.17.3 in /usr/local/lib/python3.7/dist-packages (from pandas>=0.25.0->geopandas) (1.21.5)\n",
"Requirement already satisfied: python-dateutil>=2.7.3 in /usr/local/lib/python3.7/dist-packages (from pandas>=0.25.0->geopandas) (2.8.2)\n",
"Installing collected packages: munch, cligj, click-plugins, pyproj, fiona, geopandas\n",
"Successfully installed click-plugins-1.1.1 cligj-0.7.2 fiona-1.8.21 geopandas-0.10.2 munch-2.5.0 pyproj-3.2.1\n"
]
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "qTmLBxDxBAZL"
},
"source": [
"### Connect to BigQuery\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"id": "SeTJb51SKs_W",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "f054321c-f86b-4ccb-a340-3eea606bdadc"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Authenticated\n"
]
}
],
"source": [
"from google.colab import auth\n",
"auth.authenticate_user()\n",
"print('Authenticated')"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "lK-9fSClKtAB"
},
"source": [
"### Read a table from a BigQuery into a Dataframe"
]
},
{
"cell_type": "code",
"source": [
"project_id = 'cartodb-gcp-backend-data-team'"
],
"metadata": {
"id": "O0NrGkUXlnmr"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "ONI1Xo0-KtAD",
"outputId": "db8bd88c-4106-410b-cc41-cc26707904b4"
},
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": [
"WARNING:google.auth._default:No project ID could be determined. Consider running `gcloud config set project` or setting the GOOGLE_CLOUD_PROJECT environment variable\n"
]
}
],
"source": [
"from google.cloud import bigquery\n",
"\n",
"client = bigquery.Client(project=project_id)\n",
"\n",
"df = client.query('''\n",
" SELECT * FROM `carto-do-public-data.carto.geography_usa_county_2019`\n",
" ''').to_dataframe()\n"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 206
},
"id": "XrFmZBr9KtAN",
"outputId": "b02bc03e-6e4c-4aef-8cfe-d57b510f7528"
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"\n",
" <div id=\"df-98b79c9f-4bb9-423c-a071-0fba2d532d29\">\n",
" <div class=\"colab-df-container\">\n",
" <div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>geoid</th>\n",
" <th>do_date</th>\n",
" <th>do_label</th>\n",
" <th>do_perimeter</th>\n",
" <th>do_area</th>\n",
" <th>do_num_vertices</th>\n",
" <th>geom</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>15005</td>\n",
" <td>2019-01-01</td>\n",
" <td>Kalawao</td>\n",
" <td>44918.349</td>\n",
" <td>3.097105e+07</td>\n",
" <td>160</td>\n",
" <td>POLYGON((-156.917863 21.169224, -156.919403 21...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>47153</td>\n",
" <td>2019-01-01</td>\n",
" <td>Sequatchie</td>\n",
" <td>145804.373</td>\n",
" <td>6.890534e+08</td>\n",
" <td>256</td>\n",
" <td>POLYGON((-85.45352 35.55813, -85.454984 35.552...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>21233</td>\n",
" <td>2019-01-01</td>\n",
" <td>Webster</td>\n",
" <td>154162.019</td>\n",
" <td>8.692194e+08</td>\n",
" <td>256</td>\n",
" <td>POLYGON((-87.752474 37.622796, -87.766068 37.6...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>16017</td>\n",
" <td>2019-01-01</td>\n",
" <td>Bonner</td>\n",
" <td>377667.980</td>\n",
" <td>4.967966e+09</td>\n",
" <td>256</td>\n",
" <td>POLYGON((-117.033218 48.760132, -117.033335 48...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>21023</td>\n",
" <td>2019-01-01</td>\n",
" <td>Bracken</td>\n",
" <td>125092.379</td>\n",
" <td>5.411369e+08</td>\n",
" <td>256</td>\n",
" <td>POLYGON((-84.235962 38.822361, -84.233354 38.8...</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>\n",
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-98b79c9f-4bb9-423c-a071-0fba2d532d29')\"\n",
" title=\"Convert this dataframe to an interactive table.\"\n",
" style=\"display:none;\">\n",
" \n",
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
" width=\"24px\">\n",
" <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n",
" <path d=\"M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z\"/><path d=\"M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z\"/>\n",
" </svg>\n",
" </button>\n",
" \n",
" <style>\n",
" .colab-df-container {\n",
" display:flex;\n",
" flex-wrap:wrap;\n",
" gap: 12px;\n",
" }\n",
"\n",
" .colab-df-convert {\n",
" background-color: #E8F0FE;\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: #1967D2;\n",
" height: 32px;\n",
" padding: 0 0 0 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-convert:hover {\n",
" background-color: #E2EBFA;\n",
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: #174EA6;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert {\n",
" background-color: #3B4455;\n",
" fill: #D2E3FC;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert:hover {\n",
" background-color: #434B5C;\n",
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
" fill: #FFFFFF;\n",
" }\n",
" </style>\n",
"\n",
" <script>\n",
" const buttonEl =\n",
" document.querySelector('#df-98b79c9f-4bb9-423c-a071-0fba2d532d29 button.colab-df-convert');\n",
" buttonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
"\n",
" async function convertToInteractive(key) {\n",
" const element = document.querySelector('#df-98b79c9f-4bb9-423c-a071-0fba2d532d29');\n",
" const dataTable =\n",
" await google.colab.kernel.invokeFunction('convertToInteractive',\n",
" [key], {});\n",
" if (!dataTable) return;\n",
"\n",
" const docLinkHtml = 'Like what you see? Visit the ' +\n",
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
" + ' to learn more about interactive tables.';\n",
" element.innerHTML = '';\n",
" dataTable['output_type'] = 'display_data';\n",
" await google.colab.output.renderOutput(dataTable, element);\n",
" const docLink = document.createElement('div');\n",
" docLink.innerHTML = docLinkHtml;\n",
" element.appendChild(docLink);\n",
" }\n",
" </script>\n",
" </div>\n",
" </div>\n",
" "
],
"text/plain": [
" geoid do_date do_label do_perimeter do_area do_num_vertices \\\n",
"0 15005 2019-01-01 Kalawao 44918.349 3.097105e+07 160 \n",
"1 47153 2019-01-01 Sequatchie 145804.373 6.890534e+08 256 \n",
"2 21233 2019-01-01 Webster 154162.019 8.692194e+08 256 \n",
"3 16017 2019-01-01 Bonner 377667.980 4.967966e+09 256 \n",
"4 21023 2019-01-01 Bracken 125092.379 5.411369e+08 256 \n",
"\n",
" geom \n",
"0 POLYGON((-156.917863 21.169224, -156.919403 21... \n",
"1 POLYGON((-85.45352 35.55813, -85.454984 35.552... \n",
"2 POLYGON((-87.752474 37.622796, -87.766068 37.6... \n",
"3 POLYGON((-117.033218 48.760132, -117.033335 48... \n",
"4 POLYGON((-84.235962 38.822361, -84.233354 38.8... "
]
},
"metadata": {},
"execution_count": 31
}
],
"source": [
"df.head()"
]
},
{
"cell_type": "code",
"source": [
"import geopandas as gpd\n",
"# BigQuery returns geometries in WKT\n",
"df['geom'] = gpd.GeoSeries.from_wkt(df['geom'])\n",
"gdf = gpd.GeoDataFrame(df, geometry='geom',crs=\"EPSG:4326\")"
],
"metadata": {
"id": "V4_p223eiexf"
},
"execution_count": 32,
"outputs": []
},
{
"cell_type": "code",
"source": [
"gdf.plot()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 160
},
"id": "_TLqQZg_jLne",
"outputId": "ee252aee-f55f-4e86-9fce-217f5b768975"
},
"execution_count": 37,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x7fd6dfd9e550>"
]
},
"metadata": {},
"execution_count": 37
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"source": [
"# Convert GeoPandas to Geoparquet"
],
"metadata": {
"id": "n08Bxicpk8yz"
}
},
{
"cell_type": "code",
"source": [
"import pyarrow as pa\n",
"import pyarrow.parquet as pq\n",
"import pyproj\n",
"import json"
],
"metadata": {
"id": "O_yorm17jNvg"
},
"execution_count": 41,
"outputs": []
},
{
"cell_type": "code",
"source": [
"table = pa.Table.from_pandas(gdf.head().to_wkb())\n",
"\n",
"\n",
"metadata = {\n",
" \"version\": \"0.1.0\",\n",
" \"primary_column\": \"geometry\",\n",
" \"columns\": {\n",
" \"geometry\": {\n",
" \"crs\": gdf.crs.to_wkt(pyproj.enums.WktVersion.WKT2_2019_SIMPLIFIED),\n",
" \"encoding\": \"WKB\",\n",
" \"edges\": \"planar\",\n",
" \"bbox\": [round(x, 4) for x in gdf.geometry.unary_union.bounds],\n",
" },\n",
" },\n",
"}\n",
"\n",
"schema = (\n",
" table.schema\n",
" .with_metadata({\"geo\": json.dumps(metadata)})\n",
")\n",
"table = table.cast(schema)\n"
],
"metadata": {
"id": "nnpFyywqjwuq"
},
"execution_count": 42,
"outputs": []
},
{
"cell_type": "code",
"source": [
"pq.write_table(table, \"example.parquet\")"
],
"metadata": {
"id": "nucgJxdFj9vn"
},
"execution_count": 47,
"outputs": []
}
],
"metadata": {
"colab": {
"collapsed_sections": [],
"name": "GeoParquet BigQuery",
"provenance": [],
"include_colab_link": true
},
"kernelspec": {
"display_name": "Python 3",
"name": "python3"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment