Skip to content

Instantly share code, notes, and snippets.

@gmsharpe
Created April 2, 2022 19:20
Show Gist options
  • Save gmsharpe/4a2bba5088c0263b254cf954d82c61c9 to your computer and use it in GitHub Desktop.
Save gmsharpe/4a2bba5088c0263b254cf954d82c61c9 to your computer and use it in GitHub Desktop.
parquet_with_java_tablesaw_and_google_colab.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "parquet_with_java_tablesaw_and_google_colab.ipynb",
"provenance": [],
"include_colab_link": true
},
"kernelspec": {
"name": "java",
"display_name": "java"
},
"language_info": {
"name": "java"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/gmsharpe/4a2bba5088c0263b254cf954d82c61c9/parquet_with_java_tablesaw_and_google_colab.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "code",
"source": [
"%%bash\n",
"#!/usr/bin/env bash\n",
"\n",
"echo \"Update environment...\"\n",
"apt update -q &> /dev/null \n",
"\n",
"#echo \"Install Java...\" \n",
"#apt-get install -q openjdk-11-jdk-headless &> /dev/null\n",
"\n",
"echo \"Install Jupyter java kernel...\"\n",
"curl -L https://github.com/SpencerPark/IJava/releases/download/v1.3.0/ijava-1.3.0.zip \\\n",
" -o ijava-kernel.zip &> /dev/null\n",
"\n",
"unzip -q ijava-kernel.zip -d ijava-kernel \\\n",
" && cd ijava-kernel \\\n",
" && python3 install.py --sys-prefix &> /dev/null"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "Mjyn8PAsFQrW",
"outputId": "606e4de1-6ae0-47b1-ef4f-03d548d122a1"
},
"execution_count": 1,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Update environment...\n",
"Install Jupyter java kernel...\n"
]
}
]
},
{
"cell_type": "markdown",
"source": [
"#### Connect to a hosted Runtime (Java)\n",
"\n",
"![image.png](data:image/png;base64,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Rd4mhkGQwbsizaLsYMEbkjOM8j59XB7H+XcCCQave+Q2sYmaIZIBNZQ+/PBD00OaXwr43wKPHX4hYS9nVQJFRGo+3SxaRERqNd0sWsIF70QRSqoEioiIiIQhhUARERGRMKQQKCIiIhKGFAJFREREwpBCoIiIiEgYUggUERERCUMKgSIiIiJhSCFQREREJAwpBIqIiIiEoToVAu2fbdNf/dVf/dXf8PorcjTxJ0/5U6JlDfxt/pqoTv1sHH/LVkREwgt/z10/GydH01VXXWV+h74s/M38efPm+Z5VnH42TkREREQqTZVAERGp1VQJlKPtaFYCrRznexQ8j8eDgoICVQJFREREarPo6GjExsaWa4iJiVEIFBEREanNIiIiKjb43i8iIiIiYUQhUERERCQMKQSKiIiIhCGFQBEREZEwpBAoIiIiEoYUAkVERETCkG4WXU5NmzbFmDFj0L59e3NfHrfbjfXr1+O9997Dli1bfFOJVE7Lli1xySWXoF27diXHGY+vTz/9FMuWLfNNVSyYY7J58+a44447UL9+ffM80JQpUzBx4kTfM+vbYUQEHnjgAXNj0rfeegu//vqr75Vi9vy4rKeffhonnXQSTj31VOzevds837Nnj2/Kg44//nhceumlKCoqwiuvvPKH7RCpKN0sWo62o32zaN73j/9uB4s3i87Pz4czJSXlEd+4Ws3pdCIxMdH3rGq0bt0at912Gxo2bIg5c+bgq6++Ql5eHrp06YLevXtjzZo1OHDggG/q2uX222/HBRdcgOXLlyMrK8s39lDdunXDP/7xDyQlJdXZE3hN2EYeZ7fccssfjrNjjjkGffv2xY4dO8xJz542mGMyOTkZgwcPRkZGBl577TX88ssvhwxLliwx77PxyxUDI+ezf//+P+wLzovrsmLFCvz0009mv3Xo0MHcfHTfvn0mhAY6//zzTWDlyZqhsrSgKFIROTk55qRGCoFyNPDfWxajysJ/t7dt2+Z7VnE8NwWychwiIyPLddzz33h+IVdzcDmcdtppZmdPnjwZ48ePN8mef1lFSU1NNZUOkcriccbj6csvvzzkOPv4449NyGIAs5X3mGTljoEucNi7d69vioMWLVqEzMxMdOrU6Q/fMFmh5EmX77XxOf8R6tGjh2/MQW3btjXVw9zcXN8YERE52tQcHCS7+Yu/tff4448jOzvb90rx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jUVERPB1PY/Hg/z8/LoVAhs3bmwei4hI+Ni1a5dCoISFUIdANQeLiIiIhCGFQBEREZEwpBAoIiIiEoYUAkVERETCkEKgiIiISBhyDB48uFb2DrZ7BnNgL5d9+/apd7CISBhi7+C0tDTTO9LuHawewhIuWrRood7BIiIiIuGmoKDABLryDnyfKoEiIlKrqRIoUjGqBIqIiIiEIYVAERERkTCkECgiIiIShhQCRURERMKQQqCIiIhIGFIIFBEREQlDCoEiIiIiYUghUERERCQMKQSKiIiIhCGFwCDwLvQPPvggXnjhBfTv39839qDmzZtj7Nix+M9//oOGDRti1KhRuPvuu9G6dWvfFCIiIiI1i0JgEPizdMuXL0dMTAzat2/vG3tQ165dkZKSgo0bN2LPnj1o1KiRmY7hUERERKQmUggM0qJFi5CZmYlOnTqZyqC/du3amaC4bNky8/z111/HrbfeitmzZ5vnIiIiIjWNY/DgwV7f41rF6/WWDAxg+/btQ+PGjX2vVg028TLwjRs3DosXLzbj2PzL8VyPp556Cnv37sXtt9+Ojh074pVXXikJhkOGDMHo0aNRr149M+3q1avx9ttvm+n/9re/ITY2tuT9bdu2xW233YYdO3bgySefNO8fMGAArr76asybN8+8zx8rjnfccQcyMjJMRZLL+OSTTzB16lR069YNF198MZo2bWqm3bZtG8aPH49169aZ56xYXnrppabpmj+4np2djWnTpmHy5MnmdQqcx/79+zFp0qSSkDtixAhccMEF5n0TJ0404+x12rJlC55//nkzj5tuuglr1qwx+9DpdJr9s3nzZlx22WXo1auXqbTm5eVhzpw5eP/9983nSqHYBhGpu3bt2oW0tDTzBZ3/BtiDiByeKoHlsGLFCkRFRaFLly6+MTCPGbpWrVplAlxp+vbta0KMy+UyAY7hjMHliiuuMK9v2rQJycnJJc3HHTp0QGJiIpo0aVJyXaEdcOzgUxqGq5ycHMyYMQPr16837+EyOC+Gs48//hj169fHVVddhaSkJDP+yiuvNOGZr7GCyWrn6aefjmHDhpl5du7cGddff33JPLj+3A5uD7ervNh0vnXrVvz4449IT08369KnTx/Mnz8fzz33nAnHXPaFF15opg/FNoiIiMgfKQSWA68LzMrKOqRJmCHQ7XaXVPxKw0oZq3/vvvsuZs6ciY8++ggLFy40oa179+4m2PH1li1bmukZvBi0WBljRZHatGljKlwbNmwwz0vD1x577DFMmDDBzPOUU04xlcHPPvvMBM8pU6aYgMjq5eDBg03A4rdnBi++9ssvv+DDDz80oZRhl0444QTzmPPkPLj+3A6u76mnnmqmKY/ff//dVDcZ2BjcuK0c9+abb5omd3a+YaWPlUGGvVBsg4iIiPyRQmA5MFhwYMcPhjcGEYYzVgBXrlzpm+pQrO4xzHAaVhJtrIYxSDIIMbyxGZShkNOy2dMOnJw/xzHo7N692wSksnB6uwmVWrRogQMHDpiAZGPzK6dJTU0128JmdAaxa665Bsccc4wJs48//jimT59u1o/rwnn4VyC5HWx+4TzK2/mFTdY2hl4ug1VLG9ftn//8p+mNzX1W2W0QERGR0ikElhOrVQwuDBt2U/DatWtNla40vNaPFSmGOTZV2sN5552H6OhoU+VisGPAY7hklTE+Pt4EGV4T2KpVK/NeNn1yOcHienH+DKqsDtrL5XV5XKcGDRqYdeZ1eQyhAwcOxAMPPGCaZHl9nx0AuS4FBQUmkPkra3vLIyEhwVwbWJZQbIOIiIiUTmfJcmIVjJUphjVWn9gUzGBYlvz8fBQWFppK4dNPP33I8N///hc//PCDmY4dKBgIWWFk6GLlje9h+OvZs6dZjn/F7EjYeYNNygySXE7gsj///HMznd355OabbzZ/uR4jR47EmWeeaV7Lzc1FZGSkufbOHwNaZfH6RW5XWUKxDSIiIlI6hcBy4n0AGcZYJWMnh+3bt2Pp0qW+V/+IAYVhhlU+Vq1Y4ePAJk2GQ7vCZge83r17m2WwOsjKH0MSgyGbessTAmnnzp0mWPLaQnu5DLFsSuV68VpFhikGJuJrX3/9tQmhrD7a07EpmttqYwWUTdRs2uV6cvuKiooQFxfnmwKmgsjweDgMa1wGm8FtrN7de++9+Pvf/26CZmW3QURERErnbNGixSO+x7UWOynwmrrAalVVYcBhWGOT5Ny5c831e/4GDRpkQtKvv/5qmnnZHMwesAxSrGzxOjreFuX444831wYy9DG08NdIWPnjPFkFZLjq168fmjVrZsIPb51SGvYsZicJ9orlLWRsDGbsYNGjRw8TmhiqLrnkEhOYGCoZRHnrGTZt26+zswebX3n7F4ZQVuvYC5i3aeE0XJfzzz/fBD7eJoYhmGGW09jBkZ01OA33AUMc14khmNvHZXJbiNvN2+FwHblMfo68jQ6Xxc4i7DEcim0QkbqN/07x3yT/28PoFjEiR6YQWAHsiMDQw39kvvrqqz9cL+cfAhl0eL0aq2as6DGsMRAyODFE/fbbb+Y9XH+GRG4DK1n2PHndG4MSe72WVQksKwSy8warbexhzNd5zRyvsfvuu+/MffTsSp7/6/yHlE3UX375pdmvvI2L/zwYfrnu7OHMsEpsMub6cxqGVm4H38Pwy6bzskIg58/KHauq3Ce8lyKrfrNmzTK9kfl6KLZBROo2hUCRitHNokVEpFbTzaJFKkbXBIqIiIiEIYVAERERkTCkECgiIiIShhQCRURERMKQQqCIiIhIGFIIFBEREQlDCoEiIiIiYUghUERERCQMKQSKiIiIhCGFQBEREZEwpBAoIiIiEoYUAkVERETCkEKgiIiISBhSCBQREREJQwqBIiIiImFIIVBEREQkDCkEioiIiIQhhUARERGRMKQQKCIiIhKGFAJFREREwpBCoIiIiEgYUggsh4cffhivv/46brzxRt+YP+JrnIbTSmiNGjUKd999N1q3bu0bIyIiIhWlEFgB7du3R/PmzX3PDmI4OeaYY3zPJNQaNWpU5r4XERGR8lEILCe3243k5GT07NnTN+ag7t27IyEhAQUFBb4xEkqssN56662YPXu2b4yIiIhUlGPw4MFe3+Naxev1lgwejwf79u1D48aNfa9WDTbxRkdHIyYmBnv37sV//vMf3ytWmo6IwAMPPIDU1FSzTjk5OXj00Ud9rxY3ZZ588slITEw067t69Wq8/fbb2LNnD7p164abbroJGzZsMPNntYs2b96M1157DTt27DDPk5KScOWVV5qwyeny8vLw448/4pNPPjHzJL73iiuuKKmWrVu3zrzP5XKVrA/X9bLLLoP12SMuLq7U+fjj9Oeddx6OP/54E3IZhDnfd955p2TdjjTPYObBdb/00ktNRdXhcCA7OxvTpk3D5MmTzeu33347OnbsiFdeeQXLli0z44YMGYLRo0ejXr165jnn9eGHH5a8br9n/vz56Nu3r9kXXLepU6fi888/N9MEs24iUnPt2rULaWlp5r9l/tthDyJyeM4WLVo84ntcazF08cTOgFWVTjzxRBNoGM7atGmDTZs2IT093bzWo0cP8zrD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KvTp0wfz588/ZJoLL7zQTBOMU0891QSXjRs3mnn89NNPaNOmjZk3l+GPofB///ufCXUMnO+9954JITaGEwamjz/+GJ9//jmioqJw5plnomHDhub1vn374uKLL4bL5TLvY3BjmLviiiv+sKzSMPTefPPNaNGiBT755BO8/vrrJmiec8456N+/v5nmcNvDf+APt/6BUlJSzBcCTv/777/7xgaHQZgBn8tbs2YNevTogZEjR/pePRS3609/+pMJnd999x1eeukl7N69G2eccQaGDx9upqnsvhMREakqOguVE6tR//znP02QsQdW0+i4444zgWD27NmmerRo0SK88MIL2LRpEwYOHGiCFiuEnTt3NuHEfxoGD1YG/atdh9OhQwcTLNghhfN49913zXJZiUpNTfVNVYzVRQYafoNgJYqhimHLxvFvvfUWpk+fbipYrJ6xOtioUSPzOsMZ38dlMFh99NFHWLhwIdq1a2e250i6dOliqns//vijWd9ffvkFP//8swmbnAcdbnsY6g63/oE4HT8Xhi7/amYw+Lnwmk+GeAZizqtZs2a+Vw81ePBg89qMGTNMuP3tt9/MMlk1HDRokJmmsvtORESkqigEllNpHUPsqhSbGInNmDYGsOXLl5tmXwZENjWyArR+/XrfFMXTMFg++OCDQV9buHbtWtN0y84SJ510kqlKjR8/3gTK8l6fyPDFypztwIEDvkfF28RgynmuWLHCNxbYunWr2Y5gmuAZqO655x5TaSxLVW5PefDztTEAcl5lYQBkszXX3cYwf//99+M///lPSPadiIhIVVEILCcGtsCOIXZVqkGDBigqKjokSBDDBMcTK2KVab+3ffPNN6ZSxfnx+kKG0b/97W+mqTGUYmNjTcWOTbP+1U9ev8fQxipdMFgl/fe//22aWfl+No9HRkb6Xq2+7Qml5ORkU+WzP9tAodp3IiIiVUEhMITS09NNhSc+Pt43phhP9gwDxEDI6lEofP3117j33ntx9913mw4jrCxde+21QTcpByM/Px+FhYWmc4V/9ZPDf//7X/zwww++KcvG6/54XRzDMd933XXXmb+5ubm+KYpVx/aEEquNvCjXP8z6C8W+ExERqSoKgSHECiFDYNeuXX1jrB1sPee1gAwEvDaQvVFZTbSvhSNOw/Dz97//3XTSYLgIDJNxcXElFUQ2LbPp+KGHHjLX7vEaNF7Lxw4mrE41adLETFeaw4WW0rBTyf79+831gbw+z65+sncuA04wTbXcVla+eC2c3SzK9a7I9pR3/Ynrz2od96GN+7a88wm0fft2sw28ntHGzjSPPPII7rzzzpDsOxERkaqiEBhCvPCfQY+3BLnmmmtMR4/bbrvNNAey0wBDDW85wsoQewfb09x4443mFiO8lpChYcOGDSYEsocue5deeumlpoOBHZoKCgpM4OQ1hqyUcR6jRo0yYZO3yuE6lIbXtzGMcZ7BdkpgYOXtaxjObrjhBtOse+yxx5qQwx6/wdy4eefOnWY+vP3L8OHDTc9Y3laF4Y+C3Z6KrD+xuZ7BmhVJ9kLmOnDfV7Y5lvuFQfDEE0/E+eefb9br6quvNhVMXgcain0nIiJSVRQCQ4gn/RdffNH0rmVv4D//+c8myPB2J+wdak/DjiRLliwpmYa9Z9lzdsKECWYahslZs2aZChJvOcOepqtWrTqkkwI7TXC+nD/nwdDEsPXOO++YqlNpeEsaVqeGDh1q7lsXLPYa5vIYwHjLFgY1VtLY05WVrSPh9nAe7LXM8MfbsCxYsMDc7sWu8gWzPRVdf96Pj5VFhk3ehodN02y6D7x2s7xYsXzttddMRw+Gy1tuucVsD5fFW8ZQZfediIhIVdHNokVEpFbTzaIlXLBfAVsFeazbx7vdSlgRqgSKiIiIhCGFQBEREZEwpBAoIiIiEoYUAkVERETCkEKgiIiISBhSCBQREREJQwqBIiIiImFIIVBEREQkDCkEioiIiIQhhUARERGRMKQQKCIiIhKGFAJFREREwpBCoIiIiEgYUggUERERCUMKgSIiIiJhSCFQREREJAwpBIqIiIiEIYVAERERkTBUJ0Kgw+HwPRIRkXCk84BI+TkGDx7s9T2uVbxe7yHD3r17fa+IiEi4qV+/vgmC/oNIXZOTkwOn04mIiAgz8Djn84qq1SHQ/uvxeA4JhPYgIiJ1U2Dg42CfFO3XReoahUAfO+QFBj97EBGRus0Of4GD/ZpIXaMQ6Mc/8CkAioiEn9LCn/1YpK5RCPTjHwBL+ysiInWXf/Ar7a9IXaMQGMA/8Cn8iYiEH//QpwAodZlCYBkUAEVEwpfCn4SDUIfAOnOzaO4I/0FEROou/ZsvUnl1phIoIiIiUpepEigiIiIilaYQKCIiIhKGFAJFREREwpBCoIiIiEgYUggUERERCUMKgSIiIiJhSCFQREREJAwpBIqIiIiEIYVAERERkTCkECgiIiIShhQCRURERMKQQqCIiIhIGFIIFBEREQlDCoEiIiIiYUghUERERCTsAP8fDJboCKfiYCoAAAAASUVORK5CYII=)"
],
"metadata": {
"id": "DwxjPm5U5zO1"
}
},
{
"cell_type": "code",
"source": [
"%%loadFromPOM\n",
"<dependency>\n",
" <groupId>commons-io</groupId>\n",
" <artifactId>commons-io</artifactId>\n",
" <version>2.11.0</version>\n",
"</dependency>\n",
"<dependency>\n",
" <groupId>tech.tablesaw</groupId>\n",
" <artifactId>tablesaw-core</artifactId>\n",
" <version>0.42.0</version>\n",
"</dependency>\n",
"<dependency>\n",
" <groupId>org.apache.parquet</groupId>\n",
" <artifactId>parquet-common</artifactId>\n",
" <version>1.12.2</version>\n",
"</dependency>\n",
"<dependency>\n",
" <groupId>org.apache.parquet</groupId>\n",
" <artifactId>parquet-encoding</artifactId>\n",
" <version>1.12.2</version>\n",
"</dependency>\n",
"<dependency>\n",
" <groupId>org.apache.parquet</groupId>\n",
" <artifactId>parquet-column</artifactId>\n",
" <version>1.12.2</version>\n",
"</dependency>\n",
"<dependency>\n",
" <groupId>org.apache.parquet</groupId>\n",
" <artifactId>parquet-hadoop</artifactId>\n",
" <version>1.12.2</version>\n",
"</dependency>\n",
"<dependency>\n",
" <groupId>org.apache.hadoop</groupId>\n",
" <artifactId>hadoop-common</artifactId>\n",
" <version>3.3.1</version>\n",
"</dependency>\n",
"<dependency>\n",
" <groupId>org.apache.hadoop</groupId>\n",
" <artifactId>hadoop-mapreduce-client-core</artifactId>\n",
" <version>3.3.1</version>\n",
"</dependency>\n",
"<dependency>\n",
" <groupId>org.apache.hadoop</groupId>\n",
" <artifactId>hadoop-hdfs</artifactId>\n",
" <version>3.3.1</version>\n",
"</dependency>\n",
"<dependency>\n",
" <groupId>org.apache.hadoop</groupId>\n",
" <artifactId>hadoop-main</artifactId>\n",
" <version>3.3.1</version>\n",
"</dependency>\n",
"<dependency>\n",
" <groupId>org.apache.parquet</groupId>\n",
" <artifactId>parquet-cli</artifactId>\n",
" <version>1.12.2</version>\n",
"</dependency>"
],
"metadata": {
"id": "FNjZHd0fFXHe"
},
"execution_count": 3,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"#### Download the Data"
],
"metadata": {
"id": "9MBtFaU47lUC"
}
},
{
"cell_type": "code",
"source": [
"import org.apache.commons.io.FileUtils;\n",
"\n",
"String source = \"https://s3.amazonaws.com/nyc-tlc/trip+data/green_tripdata_2021-01.csv\";\n",
"String file_path = \"/content/green_2021-01\";\n",
"FileUtils.copyURLToFile(new URL(source), new File(file_path + \".csv\"));"
],
"metadata": {
"id": "Ax9cDEbC6Agg"
},
"execution_count": 17,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"#### Preview the data in [Tablesaw](https://github.com/jtablesaw/tablesaw)\n",
"\n",
"```\n",
"NOTE: if you get an exception claiming the file cannot be found, it might be due to the 'file_path' variable not being set. \n",
"I wasn't able to figure out why this happens sometimes after first running the above few code cells....\n",
"```"
],
"metadata": {
"id": "cp_g2bG2fcye"
}
},
{
"cell_type": "code",
"source": [
"import tech.tablesaw.api.*;\n",
"import tech.tablesaw.columns.*;\n",
"\n",
"Table table = Table.read().csv(file_path + \".csv\");\n",
"table.print(20);"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "0fOOC3hNfZ9T",
"outputId": "38dffa36-1021-4824-e3ed-171ac949f139"
},
"execution_count": 22,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" green_2021-01.csv \n",
" VendorID | lpep_pickup_datetime | lpep_dropoff_datetime | store_and_fwd_flag | RatecodeID | PULocationID | DOLocationID | passenger_count | trip_distance | fare_amount | extra | mta_tax | tip_amount | tolls_amount | ehail_fee | improvement_surcharge | total_amount | payment_type | trip_type | congestion_surcharge |\n",
"-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
" 2 | 2021-01-01T00:15:56.000 | 2021-01-01T00:19:52.000 | false | 1 | 43 | 151 | 1 | 1.01 | 5.5 | 0.5 | 0.5 | 0 | 0 | | 0.3 | 6.8 | 2 | 1 | 0 |\n",
" 2 | 2021-01-01T00:25:59.000 | 2021-01-01T00:34:44.000 | false | 1 | 166 | 239 | 1 | 2.53 | 10 | 0.5 | 0.5 | 2.81 | 0 | | 0.3 | 16.86 | 1 | 1 | 2.75 |\n",
" 2 | 2021-01-01T00:45:57.000 | 2021-01-01T00:51:55.000 | false | 1 | 41 | 42 | 1 | 1.12 | 6 | 0.5 | 0.5 | 1 | 0 | | 0.3 | 8.3 | 1 | 1 | 0 |\n",
" 2 | 2020-12-31T23:57:51.000 | 2021-01-01T00:04:56.000 | false | 1 | 168 | 75 | 1 | 1.99 | 8 | 0.5 | 0.5 | 0 | 0 | | 0.3 | 9.3 | 2 | 1 | 0 |\n",
" 2 | 2021-01-01T00:16:36.000 | 2021-01-01T00:16:40.000 | false | 2 | 265 | 265 | 3 | 0 | -52 | 0 | -0.5 | 0 | 0 | | -0.3 | -52.8 | 3 | 1 | 0 |\n",
" 2 | 2021-01-01T00:16:36.000 | 2021-01-01T00:16:40.000 | false | 2 | 265 | 265 | 3 | 0 | 52 | 0 | 0.5 | 0 | 0 | | 0.3 | 52.8 | 2 | 1 | 0 |\n",
" 2 | 2021-01-01T00:19:14.000 | 2021-01-01T00:19:21.000 | false | 5 | 265 | 265 | 1 | 0 | 180 | 0 | 0 | 36.06 | 0 | | 0.3 | 216.36 | 1 | 2 | 0 |\n",
" 2 | 2021-01-01T00:26:31.000 | 2021-01-01T00:28:50.000 | false | 1 | 75 | 75 | 6 | 0.45 | 3.5 | 0.5 | 0.5 | 0.96 | 0 | | 0.3 | 5.76 | 1 | 1 | 0 |\n",
" 2 | 2021-01-01T00:57:46.000 | 2021-01-01T00:57:57.000 | false | 1 | 225 | 225 | 1 | 0 | 2.5 | 0.5 | 0.5 | 0 | 0 | | 0.3 | 3.8 | 2 | 1 | 0 |\n",
" 2 | 2021-01-01T00:58:32.000 | 2021-01-01T01:32:34.000 | false | 1 | 225 | 265 | 1 | 12.19 | 38 | 0.5 | 0.5 | 2.75 | 0 | | 0.3 | 42.05 | 1 | 1 | 0 |\n",
" ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |\n",
" | 2021-01-15T10:03:00.000 | 2021-01-15T10:28:00.000 | | | 26 | 55 | | 7.48 | 25.43 | 0 | 0 | 2.75 | 0 | | 0.3 | 28.48 | | | |\n",
" | 2021-01-15T10:06:00.000 | 2021-01-15T10:17:00.000 | | | 42 | 41 | | 0.89 | 17.69 | 0 | 0 | 2.75 | 0 | | 0.3 | 20.74 | | | |\n",
" | 2021-01-15T10:53:00.000 | 2021-01-15T11:07:00.000 | | | 41 | 74 | | 1.64 | 15.45 | 0 | 0 | 2.75 | 0 | | 0.3 | 18.5 | | | |\n",
" | 2021-01-15T10:47:00.000 | 2021-01-15T10:58:00.000 | | | 177 | 225 | | 1.71 | 16.73 | 0 | 0 | 2.75 | 0 | | 0.3 | 19.78 | | | |\n",
" | 2021-01-15T10:43:00.000 | 2021-01-15T11:20:00.000 | | | 11 | 246 | | 12.55 | 52.46 | 0 | 0 | 2.75 | 0 | | 0.3 | 55.51 | | | |\n",
" | 2021-01-15T10:35:00.000 | 2021-01-15T10:51:00.000 | | | 3 | 147 | | 5.97 | 17.01 | 0 | 0 | 0 | 0 | | 0.3 | 17.31 | | | |\n",
" | 2021-01-15T10:25:00.000 | 2021-01-15T10:34:00.000 | | | 242 | 213 | | 3.83 | 27.27 | 0 | 0 | 2.75 | 0 | | 0.3 | 30.32 | | | |\n",
" | 2021-01-15T10:16:00.000 | 2021-01-15T10:20:00.000 | | | 181 | 181 | | 0.45 | 12.89 | 0 | 0 | 2.75 | 0 | | 0.3 | 15.94 | | | |\n",
" | 2021-01-15T10:16:00.000 | 2021-01-15T10:58:00.000 | | | 244 | 72 | | 22.21 | 50.67 | 0 | 0 | 2.75 | 6.12 | | 0.3 | 59.84 | | | |\n",
" | 2021-01-15T10:24:00.000 | 2021-01-15T10:46:00.000 | | | 227 | 33 | | 4.2 | 21.37 | 0 | 0 | 2.75 | 0 | | 0.3 | 24.42 | | | |"
]
},
"metadata": {},
"execution_count": 22
}
]
},
{
"cell_type": "markdown",
"source": [
"#### Load the tablesaw-parquet Jar \n",
"\n",
"Using the `%jars` line magic from IJava, we'll load the necessary class dependencies for processing parquet files with Tablesaw.\n"
],
"metadata": {
"id": "uANVbU4b7JkH"
}
},
{
"cell_type": "code",
"source": [
"String projectGitAcct = \"https://github.com/gmsharpe\";\n",
"String path = \"/tablesaw-parquet/releases/download/0.42.0-1.12.2-3.3.1-0.11.0/\";\n",
"String tablesawParquetJar = \"tablesaw_0.42.0-parquet-0.11.0-SNAPSHOT.jar\";\n",
"\n",
"FileUtils.copyURLToFile(new URL(projectGitAcct + path + tablesawParquetJar), \n",
" new File(\"/content/\" + tablesawParquetJar));"
],
"metadata": {
"id": "P_tXLxEw7Hns"
},
"execution_count": 43,
"outputs": []
},
{
"cell_type": "code",
"source": [
"%jars \"/content/\" + tablesawParquetJar"
],
"metadata": {
"id": "_eG0pIVClRyQ"
},
"execution_count": 45,
"outputs": []
},
{
"cell_type": "code",
"source": [
"table.print(20);"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "166xXyrUWMqB",
"outputId": "a6beba72-9547-4c33-c8a7-0ac2fa9d2b5d"
},
"execution_count": 49,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" green_2021-01.csv \n",
" VendorID | lpep_pickup_datetime | lpep_dropoff_datetime | store_and_fwd_flag | RatecodeID | PULocationID | DOLocationID | passenger_count | trip_distance | fare_amount | extra | mta_tax | tip_amount | tolls_amount | ehail_fee | improvement_surcharge | total_amount | payment_type | trip_type | congestion_surcharge |\n",
"-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
" 2 | 2021-01-01T00:15:56.000 | 2021-01-01T00:19:52.000 | false | 1 | 43 | 151 | 1 | 1.01 | 5.5 | 0.5 | 0.5 | 0 | 0 | | 0.3 | 6.8 | 2 | 1 | 0 |\n",
" 2 | 2021-01-01T00:25:59.000 | 2021-01-01T00:34:44.000 | false | 1 | 166 | 239 | 1 | 2.53 | 10 | 0.5 | 0.5 | 2.81 | 0 | | 0.3 | 16.86 | 1 | 1 | 2.75 |\n",
" 2 | 2021-01-01T00:45:57.000 | 2021-01-01T00:51:55.000 | false | 1 | 41 | 42 | 1 | 1.12 | 6 | 0.5 | 0.5 | 1 | 0 | | 0.3 | 8.3 | 1 | 1 | 0 |\n",
" 2 | 2020-12-31T23:57:51.000 | 2021-01-01T00:04:56.000 | false | 1 | 168 | 75 | 1 | 1.99 | 8 | 0.5 | 0.5 | 0 | 0 | | 0.3 | 9.3 | 2 | 1 | 0 |\n",
" 2 | 2021-01-01T00:16:36.000 | 2021-01-01T00:16:40.000 | false | 2 | 265 | 265 | 3 | 0 | -52 | 0 | -0.5 | 0 | 0 | | -0.3 | -52.8 | 3 | 1 | 0 |\n",
" 2 | 2021-01-01T00:16:36.000 | 2021-01-01T00:16:40.000 | false | 2 | 265 | 265 | 3 | 0 | 52 | 0 | 0.5 | 0 | 0 | | 0.3 | 52.8 | 2 | 1 | 0 |\n",
" 2 | 2021-01-01T00:19:14.000 | 2021-01-01T00:19:21.000 | false | 5 | 265 | 265 | 1 | 0 | 180 | 0 | 0 | 36.06 | 0 | | 0.3 | 216.36 | 1 | 2 | 0 |\n",
" 2 | 2021-01-01T00:26:31.000 | 2021-01-01T00:28:50.000 | false | 1 | 75 | 75 | 6 | 0.45 | 3.5 | 0.5 | 0.5 | 0.96 | 0 | | 0.3 | 5.76 | 1 | 1 | 0 |\n",
" 2 | 2021-01-01T00:57:46.000 | 2021-01-01T00:57:57.000 | false | 1 | 225 | 225 | 1 | 0 | 2.5 | 0.5 | 0.5 | 0 | 0 | | 0.3 | 3.8 | 2 | 1 | 0 |\n",
" 2 | 2021-01-01T00:58:32.000 | 2021-01-01T01:32:34.000 | false | 1 | 225 | 265 | 1 | 12.19 | 38 | 0.5 | 0.5 | 2.75 | 0 | | 0.3 | 42.05 | 1 | 1 | 0 |\n",
" ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |\n",
" | 2021-01-15T10:03:00.000 | 2021-01-15T10:28:00.000 | | | 26 | 55 | | 7.48 | 25.43 | 0 | 0 | 2.75 | 0 | | 0.3 | 28.48 | | | |\n",
" | 2021-01-15T10:06:00.000 | 2021-01-15T10:17:00.000 | | | 42 | 41 | | 0.89 | 17.69 | 0 | 0 | 2.75 | 0 | | 0.3 | 20.74 | | | |\n",
" | 2021-01-15T10:53:00.000 | 2021-01-15T11:07:00.000 | | | 41 | 74 | | 1.64 | 15.45 | 0 | 0 | 2.75 | 0 | | 0.3 | 18.5 | | | |\n",
" | 2021-01-15T10:47:00.000 | 2021-01-15T10:58:00.000 | | | 177 | 225 | | 1.71 | 16.73 | 0 | 0 | 2.75 | 0 | | 0.3 | 19.78 | | | |\n",
" | 2021-01-15T10:43:00.000 | 2021-01-15T11:20:00.000 | | | 11 | 246 | | 12.55 | 52.46 | 0 | 0 | 2.75 | 0 | | 0.3 | 55.51 | | | |\n",
" | 2021-01-15T10:35:00.000 | 2021-01-15T10:51:00.000 | | | 3 | 147 | | 5.97 | 17.01 | 0 | 0 | 0 | 0 | | 0.3 | 17.31 | | | |\n",
" | 2021-01-15T10:25:00.000 | 2021-01-15T10:34:00.000 | | | 242 | 213 | | 3.83 | 27.27 | 0 | 0 | 2.75 | 0 | | 0.3 | 30.32 | | | |\n",
" | 2021-01-15T10:16:00.000 | 2021-01-15T10:20:00.000 | | | 181 | 181 | | 0.45 | 12.89 | 0 | 0 | 2.75 | 0 | | 0.3 | 15.94 | | | |\n",
" | 2021-01-15T10:16:00.000 | 2021-01-15T10:58:00.000 | | | 244 | 72 | | 22.21 | 50.67 | 0 | 0 | 2.75 | 6.12 | | 0.3 | 59.84 | | | |\n",
" | 2021-01-15T10:24:00.000 | 2021-01-15T10:46:00.000 | | | 227 | 33 | | 4.2 | 21.37 | 0 | 0 | 2.75 | 0 | | 0.3 | 24.42 | | | |"
]
},
"metadata": {},
"execution_count": 49
}
]
},
{
"cell_type": "markdown",
"source": [
"#### Write the Table to Disk as Parquet"
],
"metadata": {
"id": "vZnW_G9U8SZL"
}
},
{
"cell_type": "code",
"source": [
"import net.tlabs.tablesaw.parquet.*;\n",
"import org.apache.hadoop.mapred.JobConf;\n",
"\n",
"TablesawParquetWriter writer = new TablesawParquetWriter();\n",
"TablesawParquet.register();\n",
"writer.write(table, \n",
" TablesawParquetWriteOptions.builder(\"/content/green_2021-01.parquet\")\n",
" .build());"
],
"metadata": {
"id": "0KVeQcEj6WeI",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "a567899a-e192-48d7-8eca-c618e14b7e3f"
},
"execution_count": 53,
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": [
"log4j:WARN No appenders could be found for logger (org.apache.hadoop.util.Shell).\n",
"log4j:WARN Please initialize the log4j system properly.\n",
"log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"Table tableFromParquet = new TablesawParquetReader()\n",
" .read(TablesawParquetReadOptions.builder(\"/content/green_2021-01.parquet\")\n",
" .build());\n",
"\n",
"tableFromParquet.print();"
],
"metadata": {
"id": "TnFXb72FKWqb",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "5a8e298a-9eec-499b-ee0e-58bec6633b74"
},
"execution_count": 60,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" /content/green_2021-01.parquet \n",
" VendorID | lpep_pickup_datetime | lpep_dropoff_datetime | store_and_fwd_flag | RatecodeID | PULocationID | DOLocationID | passenger_count | trip_distance | fare_amount | extra | mta_tax | tip_amount | tolls_amount | ehail_fee | improvement_surcharge | total_amount | payment_type | trip_type | congestion_surcharge |\n",
"-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n",
" 2 | 2021-01-01T00:15:56.000 | 2021-01-01T00:19:52.000 | false | 1 | 43 | 151 | 1 | 1.01 | 5.5 | 0.5 | 0.5 | 0 | 0 | | 0.3 | 6.8 | 2 | 1 | 0 |\n",
" 2 | 2021-01-01T00:25:59.000 | 2021-01-01T00:34:44.000 | false | 1 | 166 | 239 | 1 | 2.53 | 10 | 0.5 | 0.5 | 2.81 | 0 | | 0.3 | 16.86 | 1 | 1 | 2.75 |\n",
" 2 | 2021-01-01T00:45:57.000 | 2021-01-01T00:51:55.000 | false | 1 | 41 | 42 | 1 | 1.12 | 6 | 0.5 | 0.5 | 1 | 0 | | 0.3 | 8.3 | 1 | 1 | 0 |\n",
" 2 | 2020-12-31T23:57:51.000 | 2021-01-01T00:04:56.000 | false | 1 | 168 | 75 | 1 | 1.99 | 8 | 0.5 | 0.5 | 0 | 0 | | 0.3 | 9.3 | 2 | 1 | 0 |\n",
" 2 | 2021-01-01T00:16:36.000 | 2021-01-01T00:16:40.000 | false | 2 | 265 | 265 | 3 | 0 | -52 | 0 | -0.5 | 0 | 0 | | -0.3 | -52.8 | 3 | 1 | 0 |\n",
" 2 | 2021-01-01T00:16:36.000 | 2021-01-01T00:16:40.000 | false | 2 | 265 | 265 | 3 | 0 | 52 | 0 | 0.5 | 0 | 0 | | 0.3 | 52.8 | 2 | 1 | 0 |\n",
" 2 | 2021-01-01T00:19:14.000 | 2021-01-01T00:19:21.000 | false | 5 | 265 | 265 | 1 | 0 | 180 | 0 | 0 | 36.06 | 0 | | 0.3 | 216.36 | 1 | 2 | 0 |\n",
" 2 | 2021-01-01T00:26:31.000 | 2021-01-01T00:28:50.000 | false | 1 | 75 | 75 | 6 | 0.45 | 3.5 | 0.5 | 0.5 | 0.96 | 0 | | 0.3 | 5.76 | 1 | 1 | 0 |\n",
" 2 | 2021-01-01T00:57:46.000 | 2021-01-01T00:57:57.000 | false | 1 | 225 | 225 | 1 | 0 | 2.5 | 0.5 | 0.5 | 0 | 0 | | 0.3 | 3.8 | 2 | 1 | 0 |\n",
" 2 | 2021-01-01T00:58:32.000 | 2021-01-01T01:32:34.000 | false | 1 | 225 | 265 | 1 | 12.19 | 38 | 0.5 | 0.5 | 2.75 | 0 | | 0.3 | 42.05 | 1 | 1 | 0 |\n",
" ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |\n",
" | 2021-01-15T10:03:00.000 | 2021-01-15T10:28:00.000 | | | 26 | 55 | | 7.48 | 25.43 | 0 | 0 | 2.75 | 0 | | 0.3 | 28.48 | | | |\n",
" | 2021-01-15T10:06:00.000 | 2021-01-15T10:17:00.000 | | | 42 | 41 | | 0.89 | 17.69 | 0 | 0 | 2.75 | 0 | | 0.3 | 20.74 | | | |\n",
" | 2021-01-15T10:53:00.000 | 2021-01-15T11:07:00.000 | | | 41 | 74 | | 1.64 | 15.45 | 0 | 0 | 2.75 | 0 | | 0.3 | 18.5 | | | |\n",
" | 2021-01-15T10:47:00.000 | 2021-01-15T10:58:00.000 | | | 177 | 225 | | 1.71 | 16.73 | 0 | 0 | 2.75 | 0 | | 0.3 | 19.78 | | | |\n",
" | 2021-01-15T10:43:00.000 | 2021-01-15T11:20:00.000 | | | 11 | 246 | | 12.55 | 52.46 | 0 | 0 | 2.75 | 0 | | 0.3 | 55.51 | | | |\n",
" | 2021-01-15T10:35:00.000 | 2021-01-15T10:51:00.000 | | | 3 | 147 | | 5.97 | 17.01 | 0 | 0 | 0 | 0 | | 0.3 | 17.31 | | | |\n",
" | 2021-01-15T10:25:00.000 | 2021-01-15T10:34:00.000 | | | 242 | 213 | | 3.83 | 27.27 | 0 | 0 | 2.75 | 0 | | 0.3 | 30.32 | | | |\n",
" | 2021-01-15T10:16:00.000 | 2021-01-15T10:20:00.000 | | | 181 | 181 | | 0.45 | 12.89 | 0 | 0 | 2.75 | 0 | | 0.3 | 15.94 | | | |\n",
" | 2021-01-15T10:16:00.000 | 2021-01-15T10:58:00.000 | | | 244 | 72 | | 22.21 | 50.67 | 0 | 0 | 2.75 | 6.12 | | 0.3 | 59.84 | | | |\n",
" | 2021-01-15T10:24:00.000 | 2021-01-15T10:46:00.000 | | | 227 | 33 | | 4.2 | 21.37 | 0 | 0 | 2.75 | 0 | | 0.3 | 24.42 | | | |"
]
},
"metadata": {},
"execution_count": 60
}
]
},
{
"cell_type": "code",
"source": [
"tableFromParquet.structure()"
],
"metadata": {
"id": "HJOFYZQLZiY_",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "fec36261-a684-4419-abc0-4cdec5f9f7ac"
},
"execution_count": 68,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" Structure of /content/green_2021-01.parquet \n",
" Index | Column Name | Column Type |\n",
"-------------------------------------------------------\n",
" 0 | VendorID | INTEGER |\n",
" 1 | lpep_pickup_datetime | LOCAL_DATE_TIME |\n",
" 2 | lpep_dropoff_datetime | LOCAL_DATE_TIME |\n",
" 3 | store_and_fwd_flag | BOOLEAN |\n",
" 4 | RatecodeID | INTEGER |\n",
" 5 | PULocationID | INTEGER |\n",
" 6 | DOLocationID | INTEGER |\n",
" 7 | passenger_count | INTEGER |\n",
" 8 | trip_distance | DOUBLE |\n",
" 9 | fare_amount | DOUBLE |\n",
" 10 | extra | DOUBLE |\n",
" 11 | mta_tax | DOUBLE |\n",
" 12 | tip_amount | DOUBLE |\n",
" 13 | tolls_amount | DOUBLE |\n",
" 14 | ehail_fee | STRING |\n",
" 15 | improvement_surcharge | DOUBLE |\n",
" 16 | total_amount | DOUBLE |\n",
" 17 | payment_type | INTEGER |\n",
" 18 | trip_type | INTEGER |\n",
" 19 | congestion_surcharge | DOUBLE |"
]
},
"metadata": {},
"execution_count": 68
}
]
},
{
"cell_type": "code",
"source": [
""
],
"metadata": {
"id": "F9nmR5pnmriA"
},
"execution_count": null,
"outputs": []
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment