{"id":13791171,"url":"https://github.com/ianmcook/implyr","last_synced_at":"2025-04-07T14:15:45.488Z","repository":{"id":54647868,"uuid":"85343198","full_name":"ianmcook/implyr","owner":"ianmcook","description":"SQL backend to dplyr for Impala","archived":false,"fork":false,"pushed_at":"2024-02-21T14:57:09.000Z","size":455,"stargazers_count":80,"open_issues_count":20,"forks_count":15,"subscribers_count":8,"default_branch":"master","last_synced_at":"2024-04-26T21:32:47.846Z","etag":null,"topics":["apache","dplyr","dplyr-sql-backends","hadoop","impala","jdbc","odbc","r","sql","tidyverse"],"latest_commit_sha":null,"homepage":"","language":"R","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ianmcook.png","metadata":{"files":{"readme":"README.Rmd","changelog":"NEWS.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-03-17T18:30:04.000Z","updated_at":"2024-08-03T22:04:37.448Z","dependencies_parsed_at":"2024-08-03T22:14:41.140Z","dependency_job_id":null,"html_url":"https://github.com/ianmcook/implyr","commit_stats":{"total_commits":273,"total_committers":4,"mean_commits":68.25,"dds":0.1135531135531136,"last_synced_commit":"4d07ed844cbd383f6cf13435dddf6aa402450cda"},"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ianmcook%2Fimplyr","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ianmcook%2Fimplyr/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ianmcook%2Fimplyr/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ianmcook%2Fimplyr/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ianmcook","download_url":"https://codeload.github.com/ianmcook/implyr/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247666015,"owners_count":20975788,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["apache","dplyr","dplyr-sql-backends","hadoop","impala","jdbc","odbc","r","sql","tidyverse"],"created_at":"2024-08-03T22:00:56.906Z","updated_at":"2025-04-07T14:15:45.468Z","avatar_url":"https://github.com/ianmcook.png","language":"R","funding_links":[],"categories":["R","Sparklyr Infrastructure"],"sub_categories":["Impala"],"readme":"---\noutput: github_document\n---\n\n\u003c!-- README.md is generated from README.Rmd. Please edit that file --\u003e\n\n```{r, echo = FALSE}\nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#\u003e\",\n  fig.path = \"README-\"\n)\n```\n\n# implyr \u003cimg src=\"man/figures/logo.png\" align=\"right\" height=\"139\" /\u003e\n\n\u003c!-- badges: start --\u003e\n[![Build Status](https://travis-ci.org/ianmcook/implyr.svg?branch=master)](https://travis-ci.org/ianmcook/implyr)\n[![CRAN_Status_Badge](https://www.r-pkg.org/badges/version/implyr)](https://cran.r-project.org/package=implyr)\n\u003c!-- badges: end --\u003e\n\n## Overview\n\n**implyr** is a SQL backend to [dplyr](https://cran.r-project.org/package=dplyr) for [Apache Impala](https://impala.apache.org), the massively parallel processing query engine. Impala enables low-latency SQL queries on large datasets stored in HDFS, Apache HBase, Apache Kudu, Amazon S3, Microsoft ADLS, and Dell EMC Isilon.\n\nimplyr is designed to work with any [DBI](https://cran.r-project.org/package=DBI)-compatible interface to Impala. implyr does not provide the underlying connectivity to Impala, nor does it require that you use one particular R package for connectivity to Impala. Currently, two packages that can provide this connectivity are [odbc](https://cran.r-project.org/package=odbc) and [RJDBC](https://cran.r-project.org/package=RJDBC). Future packages may provide other options for connectivity.\n\n## Installation\n\nYou can install the latest release of implyr from CRAN:\n\n```{r, eval=FALSE}\ninstall.packages(\"implyr\")\n```\n\nOr you can install the current development version from GitHub:\n\n```{r, eval=FALSE}\ndevtools::install_github(\"ianmcook/implyr\")\n```\n\nYou must also install a package and driver to provide connectivity to Impala.\n\n#### ODBC Connectivity\n\n[odbc](https://cran.r-project.org/package=odbc) is currently the preferred R package for connecting to Impala. It provides superior performance and compatibility.\n\n1. Ensure that the system where your R code will run supports ODBC. ODBC support is built into Windows but requires [unixODBC](https://www.unixodbc.org) or [iODBC](https://www.iodbc.org) on Linux and macOS.\n\n2. Install the odbc package from CRAN:\n    ```{r, eval=FALSE}\n    install.packages(\"odbc\")\n    ```\n\n3. Download and install the latest version of the [Impala ODBC driver from Cloudera](https://www.cloudera.com/downloads/connectors/impala/odbc.html).\n\n4. Complete the installation and configuration steps described in the [odbc package README](https://cran.r-project.org/package=odbc/readme/README.html#installation) and the [Impala ODBC driver installation guide](https://docs.cloudera.com/documentation/other/connectors/impala-odbc/latest/Cloudera-ODBC-Driver-for-Impala-Install-Guide.pdf).\n\n#### JDBC Connectivity\n\nPackage [RJDBC](https://cran.r-project.org/package=RJDBC) can provide access to Impala through JDBC.\n\n1. Ensure that the system where your R code will run has a Java Runtime Environment (JRE) installed.\n\n2. Install the RJDBC package from CRAN:\n\n    ```{r, eval=FALSE}\n    install.packages(\"RJDBC\")\n    ```\n\n3. Download and install the latest version of the [Impala JDBC driver from Cloudera](https://www.cloudera.com/downloads/connectors/impala/jdbc.html).\n\n4. Complete the installation and configuration steps described in the [Impala JDBC driver installation guide](https://docs.cloudera.com/documentation/other/connectors/impala-jdbc/latest/Cloudera-JDBC-Driver-for-Impala-Install-Guide.pdf).\n\n## Connecting to Impala\n\nFirst, load the implyr package:\n\n```{r, eval=FALSE}\nlibrary(implyr)\n```\n\nThe next step depends on the method you will use to connect to Impala.\n\n#### ODBC Connectivity\n\nLoad the odbc package:\n\n```{r, eval=FALSE}\nlibrary(odbc)\n```\n\nCreate an ODBC driver object:\n\n```{r, eval=FALSE}\ndrv \u003c- odbc::odbc()\n```\n\nCall `src_impala()` to connect to Impala and create a dplyr data source. In the call to `src_impala()`, specify the arguments required by `odbc::dbConnect()`. These arguments can consist of individual ODBC keywords (`driver`, `host`, `port`, `database`, `uid`, `pwd`, and others), an ODBC data source name (`dsn`), or an ODBC connection string (`.connection_string`). For example:\n\n```{r, eval=FALSE}\nimpala \u003c- src_impala(\n    drv = drv,\n    driver = \"Cloudera ODBC Driver for Impala\",\n    host = \"host\",\n    port = 21050,\n    database = \"default\",\n    uid = \"username\",\n    pwd = \"password\"\n  )\n```\n\nThe returned object `impala` provides a remote dplyr data source to Impala.\n\nFor more information about which arguments you can pass to `src_impala()` when using ODBC connectivity, see `?\"dbConnect,OdbcDriver-method\"` and the [Authentication](#authentication) section below.\n\n#### JDBC Connectivity\n\nLoad the RJDBC package:\n\n```{r, eval=FALSE}\nlibrary(RJDBC)\n```\n\nInitialize the Java Virtual Machine (JVM) by calling `.jinit()` and passing a vector containing the paths to all the Impala JDBC driver JAR files as the `classpath` argument:\n\n```{r, eval=FALSE}\nimpala_classpath \u003c- list.files(path = \"/path/to/jdbc/driver\", pattern = \"\\\\.jar$\", full.names = TRUE)\n.jinit(classpath = impala_classpath)\n```\n\nIf an error occurs, you may need to first set the `JAVA_HOME` environment variable:\n\n```{r, eval=FALSE}\nSys.setenv(JAVA_HOME = \"/path/to/java/home/\")\n```\n\nCreate a JDBC driver object:\n\n```{r, eval=FALSE}\ndrv \u003c- JDBC(\n  driverClass = \"com.cloudera.impala.jdbc41.Driver\",\n  classPath = impala_classpath,\n  identifier.quote = \"`\"\n)\n```\n\nIf you are using the JDBC version 4.0 driver, specify `com.cloudera.impala.jdbc4.Driver`. If you are using the JDBC version 4.1 driver, specify `com.cloudera.impala.jdbc41.Driver`.\n\nCall `src_impala()` to connect to Impala and create a dplyr data source. In the call to `src_impala()`, specify a JDBC connection string as the first argument. Optionally, specify a username as the second argument and a password as the third argument. For example:\n\n```{r, eval=FALSE}\nimpala \u003c- src_impala(drv, \"jdbc:impala://host:21050\", \"username\", \"password\")\n```\n\nOr include the username and password (or other authentication properties) in the connection string:\n\n```{r, eval=FALSE}\nimpala \u003c- src_impala(drv, \"jdbc:impala://host:21050;UID=username;PWD=password\")\n```\n\nThe returned object `impala` provides a remote dplyr data source to Impala.\n\nSee the [Authentication](#authentication) section below for information about how to construct the JDBC connection string when using different authentication methods.\n\nDo not attempt to connect to Impala using more than one method in one R session.\n\n#### Authentication\n\nThe Impala ODBC and JDBC drivers support multiple authentication methods, including no authentication, username, username and password, and Kerberos. To use Kerberos, specify properties including `AuthMech`, `KrbRealm`, `KrbHostFQDN`, and `KrbServiceName`. Consult your system administrator and the [Impala ODBC driver installation guide](https://docs.cloudera.com/documentation/other/connectors/impala-odbc/latest/Cloudera-ODBC-Driver-for-Impala-Install-Guide.pdf) or [Impala JDBC driver installation guide](https://docs.cloudera.com/documentation/other/connectors/impala-jdbc/latest/Cloudera-JDBC-Driver-for-Impala-Install-Guide.pdf).\n\n## Using dplyr\n\nNow you can use dplyr verbs against tables in Impala.\n\nTo see what tables are in the current database in Impala, issue the command:\n\n```{r, eval=FALSE}\nsrc_tbls(impala)\n```\n\nFor this example, start by creating a lazy `tbl` named `flights_tbl` representing the data in the Impala table named `flights`:\n\n```{r, eval=FALSE}\nflights_tbl \u003c- tbl(impala, \"flights\")\n```\n\nTo specify the database that contains the table, use the function `in_schema()`. For example, if the Impala table named `flights` were in a database named `nycflights13`, then you would use the command:\n\n```{r, eval=FALSE}\nflights_tbl \u003c- tbl(impala, in_schema(\"nycflights13\", \"flights\"))\n```\n\nThe examples here assume that data has already been loaded into the Impala table named `flights`. See the [Loading Local Data into Impala](#loading-local-data-into-impala) section below for information about ways to load data from R into Impala.\n\n\u003c!-- if you change this example, also change the corresponding test in test-readme.R --\u003e\n```{r, eval=FALSE}\ndelay \u003c- flights_tbl %\u003e% \n  select(tailnum, distance, arr_delay) %\u003e%\n  group_by(tailnum) %\u003e%\n  summarise(count = n(), dist = mean(distance, na.rm = TRUE), delay = mean(arr_delay, na.rm = TRUE)) %\u003e%\n  filter(count \u003e 20L, dist \u003c 2000L, !is.na(delay)) %\u003e%\n  arrange(delay, dist, count) %\u003e%\n  collect()\n```\n\nimplyr supports the dplyr verbs `filter()`, `arrange()`, `select()`, `rename()`, `distinct()`, `mutate()`, `transmute()`, and `summarise()`. It supports grouped operations with the `group_by()` function.\n\nWhen using implyr, you must specify table names and column names using lowercase characters. To ensure that results are in sorted order, you must apply `arrange()` last, after all other dplyr verbs.\n\nImpala does not perform implicit casting; for example, it does not automatically convert numbers to strings when they are used in a string context. Impala requires that you explicitly cast columns to the required types. implyr provides familiar R-style type conversion functions to enable casting to all the scalar [Impala data types](https://docs.cloudera.com/documentation/enterprise/latest/topics/impala_datatypes.html). For example, `as.character()` casts a column or column expression to the Impala `STRING` type.\n\n\u003c!-- if you change this example, also change the corresponding test in test-readme.R --\u003e\n```{r, eval=FALSE}\nflights_tbl %\u003e% \n  transmute(flight_code = paste0(carrier, as.character(flight))) %\u003e% \n  distinct(flight_code)\n```\n\nIn addition, you should specify integer values as R `integer` objects instead of `numeric` objects; for example, `1L` or `as.integer(1)` instead of `1`.\n\nSee [Introduction to dplyr](https://cran.r-project.org/package=dplyr/vignettes/dplyr.html) for more examples of dplyr grammar.\n\nLike other SQL backends to dplyr, implyr delays work until a result needs to be computed, then computes the result as a single query operation.\n\n* Use `collect()` to execute the query and return the result to R as a data frame `tbl`.\n* Use `as.data.frame()` to execute the query and return the result to R as an ordinary data frame.\n* Use `compute(temporary = FALSE)` to execute the query and store the result in an Impala table. Impala does not support temporary tables, so `temporary = FALSE` is required.\n* Use `collapse()` to generate the query for later execution.\n\nIf you print or store a result without using one of these functions, then implyr returns a lazy `tbl`. Only use `collect()` or `as.data.frame()` when the result will be small enough to fit in memory in your R session.\n\nSee the [Introduction to d**b**plyr](https://cran.r-project.org/package=dbplyr/vignettes/dbplyr.html) for more information.\n\nimplyr supports window functions, which enable computation of ranks, offsets, and cumulative aggregates. See [Window functions](https://cran.r-project.org/package=dplyr/vignettes/window-functions.html) for more information.\n\n\u003c!-- if you change this example, also change the corresponding test in test-readme.R --\u003e\n```{r, eval=FALSE}\nworst_delay_each_day \u003c- flights_tbl %\u003e%\n  group_by(year, month, day) %\u003e%\n  filter(arr_delay == max(arr_delay)) %\u003e%\n  arrange(year, month, day) %\u003e%\n  collect()\n```\n\nimplyr supports most [two-table verbs](https://cran.r-project.org/package=dplyr/vignettes/two-table.html), which enable joins and set operations.\n\n\u003c!-- if you change this example, also change the corresponding test in test-readme.R --\u003e\n```{r, eval=FALSE}\nairlines_tbl \u003c- tbl(impala, \"airlines\")\ninner_join(flights_tbl, airlines_tbl, by = \"carrier\")\n```\n\nimplyr supports efficient filtering joins.\n\n\u003c!-- if you change this example, also change the corresponding test in test-readme.R --\u003e\n```{r, eval=FALSE}\nairlines_tbl \u003c- tbl(impala, \"airlines\")\nsouthwest_airlines \u003c- airlines_tbl %\u003e% filter(name == \"Southwest Airlines Co.\")\nsouthwest_flights \u003c- semi_join(flights_tbl, southwest_airlines, by = \"carrier\")\n```\n\nYou can also use dplyr join functions to bring together values from `ARRAY` and `MAP` columns with scalar values from the same rows. See [Impala Complex Types](https://docs.cloudera.com/documentation/enterprise/latest/topics/impala_complex_types.html) for more details about `ARRAY` and `MAP` columns.\n\nRead the [Warnings and Current Limitations](#warnings-and-current-limitations) section below to understand the ways that working with Impala as a remote dplyr data source is different from working with local data or other remote dplyr data sources.\n\n\u003c!-- if you add more examples here, also add corresponding tests in test-readme.R --\u003e\n\n## Using SQL\n\nIn addition to using dplyr grammar, you can also issue SQL queries to Impala.\n\nTo execute a statement that returns no result set, use the `dbExecute()` function:\n\n\u003c!-- if you change this example, also change the corresponding test in test-readme.R --\u003e\n```{r, eval=FALSE}\ndbExecute(impala, \"REFRESH flights\")\n```\n\nTo execute a query and return the result to R as a data frame, use the `dbGetQuery()` function.\n\n\u003c!-- if you change this example, also change the corresponding test in test-readme.R --\u003e\n```{r, eval=FALSE}\nflights_by_carrier_df \u003c- dbGetQuery(\n  impala,\n  \"SELECT carrier, COUNT(*) FROM flights GROUP BY carrier\"\n)\n```\n\nOnly use `dbGetQuery` when the query result will be small enough to fit in memory in your R session.\n\nYou can also execute SQL and return the result as a lazy `tbl`:\n\n\u003c!-- if you change this example, also change the corresponding test in test-readme.R --\u003e\n```{r, eval=FALSE}\nflights_tbl \u003c- tbl(impala, sql(\"SELECT * FROM flights\"))\n```\n\n\u003c!-- if you add more examples here, also add corresponding tests in test-readme.R --\u003e\n\n## Disconnecting\n\nWhen you are finished, close the connection to Impala:\n\n```{r, eval=FALSE}\ndbDisconnect(impala)\n```\n\n## Loading Local Data into Impala\n\nThe examples above assume that data has already been loaded into Impala. If you wish to run the examples above, you will need to load data from the package [nycflights13](https://cran.r-project.org/package=nycflights13) into Impala.\n\nimplyr does not provide tools for loading local data into Impala tables. This is because Impala can query data stored in several different filesystems and storage systems (HDFS, Apache HBase, Apache Kudu, Amazon S3, Microsoft ADLS, and Dell EMC Isilon) and Impala does not include built-in capability for loading local data into these systems.\n\nSome other dplyr backends implement the function `copy_to`, which copies a local data frame to a remote source. `implyr` implements `copy_to`, but it currently only supports very small data frames. It uses the SQL `INSERT ... VALUES()` technique, which is not suitable for loading large amounts of data.\n\nHDFS is the most common system for storing data in Impala tables. There are two methods described below for uploading data from R into HDFS.\n\nTo load the data frame `nycflights13::flights` into HDFS, first install and load the nycflights13 package:\n\n```{r, eval=FALSE}\ninstall.packages(\"nycflights13\")\nlibrary(nycflights13)\n```\n\nThen issue an SQL statement to create a table `flights` in Impala with a schema that matches the data frame `flights`:\n\n```{r, eval=FALSE}\ndbExecute(impala, \"CREATE TABLE flights (\n    year SMALLINT,\n    month TINYINT,\n    day TINYINT,\n    dep_time SMALLINT,\n    sched_dep_time SMALLINT,\n    dep_delay SMALLINT,\n    arr_time SMALLINT,\n    sched_arr_time SMALLINT,\n    arr_delay SMALLINT,\n    carrier STRING,\n    flight SMALLINT,\n    tailnum STRING,\n    origin STRING,\n    dest STRING,\n    air_time SMALLINT,\n    distance SMALLINT,\n    hour TINYINT,\n    minute TINYINT,\n    time_hour TIMESTAMP)\n  ROW FORMAT DELIMITED FIELDS TERMINATED BY '\\t'\n  LOCATION '/user/hive/warehouse/flights'\")\n```\n\nNext, write the data frame `flights` to a local file:\n\n```{r, eval=FALSE}\nwrite.table(flights, file = \"flights\", quote = FALSE, sep = \"\\t\", na = \"\\\\N\", row.names = FALSE, col.names = FALSE)\n```\n\nIf the Hadoop File System shell is installed on the system where you are running R, then you can issue an `hdfs dfs -put` command to load this local file to HDFS. You can issue the command from R using the `system()` function:\n\n```{r, eval=FALSE}\nsystem(\"hdfs dfs -put flights /user/hive/warehouse/flights/000000_0\")\n```\n\nAnother option is to use the R package [rwebhdfs](https://github.com/saurfang/rwebhdfs) to load the local file into HDFS using the WebHDFS REST API:\n\n```{r, eval=FALSE}\ndevtools::install_github(\"saurfang/rwebhdfs\")\nlibrary(rwebhdfs)\nhdfs \u003c- webhdfs(\"host\", 50070, \"username\")\nwrite_file(hdfs, \"/user/hive/warehouse/flights/000000_0\", \"flights\")\n```\n\nAfter loading the data, issue the Impala command `INVALIDATE METADATA` to refresh Impala's metadata cache:\n\n```{r, eval=FALSE}\ndbExecute(impala, \"INVALIDATE METADATA\")\n```\n\n## Warnings and Current Limitations \n\n#### Using implyr with RJDBC \n\nThe RJDBC package is not fully DBI-compatible. implyr works around these incompatibilities as best it can.\n\nRJDBC has a crude type handling system: columns and column expressions with numeric types are returned to R as `numeric` columns, and all other types are returned as `character` columns. This has undesirable effects; for example, Boolean types are returned as `character` columns with values `\"0\"` for `FALSE` and or `\"1\"` for `TRUE`.\n\nWhen using the function `copy_to` with RJDBC, data types may be modified in unexpected ways. For example, inserted `character` values may be right-padded with whitespace.\n\nIf possible, connect to Impala using the odbc package instead of the RJDBC package.\n\n#### Row Order\n\nImpala's data storage and processing does not preserve row order. Impala uses parallel processing and stores data in multiple files, so the the notion of data being stored in sorted order is impractical. This has several important implications for the use of implyr:\n\n* Rows are not necessarily returned in the same order that they were in when added to Impala. To return rows in a specific order, you must use `arrange()`.\n* If row ordering is applied in an intermediate phase of query processing, Impala may not return the final result in sorted order. To ensure that results are in sorted order, apply `arrange()` last, after all other dplyr verbs. implyr will issue a warning if you apply `arrange()` in an earlier step.\n* When using `compute()` to store results in an Impala table, Impala may not preserve row order. implyr will issue a warning if you use `arrange()` before `compute()`.\n\nSee the [Impala ORDER BY documentation](https://docs.cloudera.com/documentation/enterprise/latest/topics/impala_order_by.html) for more information.\n\n#### Temporary Tables\n\nImpala does not support temporary tables. When using `compute()` to store results in an Impala table, you must set `temporary = FALSE`. implyr will throw an error if you use `compute()` but do not set `temporary = FALSE`.\n\n#### Missing Values\n\nSQL engines including Impala treat missing values differently than R does. To avoid unexpected results, handle missing values before applying other operations on column values.\n\n#### Table and Column Names\n\nImpala requires table names and column names to be all lowercase. Currently, implyr does not convert table names and column names to lowercase; you must specify them using all lowercase characters. For information about other limitations on table names and column names, see [Overview of Impala Identifiers](https://docs.cloudera.com/documentation/enterprise/latest/topics/impala_identifiers.html).\n\n#### dplyr Support\n\nimplyr does not support all dplyr verbs and functions. Some verbs including `slice()`, `sample_n()`, and `sample_frac()` are not supported. Some functions including `intersect()` and `setdiff()` are not supported.\n\nIf you apply an R function to a lazy `tbl` and the function is not implemented as a remote method, then implyr will compute the result of the prior steps and return that result to R as a `tbl` or data frame. It will then compute the function and any later steps locally in R. An example of this is the function `lm`. Only use this technique when the intermediate result will be small enough to fit in memory in your R session.\n\nThe `median()` function returns a value that is approximately (not necessarily exactly) the median. See [APPX_MEDIAN Function](https://docs.cloudera.com/documentation/enterprise/latest/topics/impala_appx_median.html).\n\nimplyr supports some Impala functions that are not specified by R or by dplyr. See [Impala Built-In Functions](https://docs.cloudera.com/documentation/enterprise/latest/topics/impala_functions.html) for more information.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fianmcook%2Fimplyr","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fianmcook%2Fimplyr","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fianmcook%2Fimplyr/lists"}