blob: ad2fedad3d8889c8efd09ff760e8044c1c9c6816 [file] [log] [blame]
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<!-- Always force latest IE rendering engine or request Chrome Frame -->
<meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible">
<link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,300italic,400italic,400,600' rel='stylesheet' type='text/css'>
<!-- Use title if it's in the page YAML frontmatter -->
<title>
PXF External Tables and API |
Apache HAWQ (Incubating) Docs
</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="/stylesheets/all.css" rel="stylesheet" media="screen, print" />
<link href="/stylesheets/print.css" rel="stylesheet" media="print" />
<link href='/images/favicon.ico' rel='shortcut icon'>
<script src="/javascripts/all.js"></script>
</head>
<body class="docs docs_userguide docs_userguide_2_3_0_0-incubating docs_userguide_2_3_0_0-incubating_pxf docs_userguide_2_3_0_0-incubating_pxf_PXFExternalTableandAPIReference has-subnav">
<div class="viewport">
<div class='wrap'>
<script type="text/javascript">
document.domain = "";
</script>
<header class="header header-layout">
<h1 class="logo">
<a href="/">Apache HAWQ (incubating) Documentation</a>
</h1>
<div class="header-links js-bar-links">
<div class="btn-menu" data-behavior="MenuMobile"></div>
<div class="header-item"><a href="http://hawq.incubator.apache.org/">Back to Apache HAWQ Page</a></div>
<div class="header-item">
<a href="https://issues.apache.org/jira/browse/HAWQ" target="_blank">Issues</a>
</div>
</div>
</header>
<div class="container">
<!--googleoff: index-->
<div id="sub-nav" class="js-sidenav nav-container" role="navigation">
<a class="sidenav-title" data-behavior="SubMenuMobile"> Doc Index</a>
<div class="nav-content">
<ul>
<li>
Apache HAWQ (incubating)
</li>
<li><a href="/docs/userguide/2.3.0.0-incubating/requirements/system-requirements.html">System Requirements</a>
</li>
<li class="has_submenu">
<span>
HAWQ System Overview
</span>
<ul>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/overview/HAWQOverview.html">What is HAWQ?</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/overview/HAWQArchitecture.html">HAWQ Architecture</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/overview/TableDistributionStorage.html">Table Distribution and Storage</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/overview/ElasticSegments.html">Elastic Query Execution Runtime</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/overview/ResourceManagement.html">Resource Management</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/overview/HDFSCatalogCache.html">HDFS Catalog Cache</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/overview/ManagementTools.html">Management Tools</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/overview/RedundancyFailover.html">High Availability, Redundancy and Fault Tolerance</a>
</li>
</ul>
</li>
<li class="has_submenu">
<a href="/docs/userguide/2.3.0.0-incubating/tutorial/overview.html">Getting Started with HAWQ Tutorial</a>
<ul>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/tutorial/gettingstarted/introhawqenv.html">Lesson 1 - Runtime Environment</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/tutorial/gettingstarted/basichawqadmin.html">Lesson 2 - Cluster Administration</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/tutorial/gettingstarted/basicdbadmin.html">Lesson 3 - Database Administration</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/tutorial/gettingstarted/dataandscripts.html">Lesson 4 - Sample Data Set and HAWQ Schemas</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/tutorial/gettingstarted/introhawqtbls.html">Lesson 5 - HAWQ Tables</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/tutorial/gettingstarted/intropxfhdfs.html">Lesson 6 - HAWQ Extension Framework (PXF)</a>
</li>
</ul>
</li>
<li class="has_submenu">
<span>
Running a HAWQ Cluster
</span>
<ul>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/admin/RunningHAWQ.html">Overview</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/admin/setuphawqopenv.html">Introducing the HAWQ Operating Environment</a>
</li>
<li class="has_submenu">
<a href="/docs/userguide/2.3.0.0-incubating/admin/ambari-admin.html">Managing HAWQ Using Ambari</a>
<ul>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/admin/ambari-rest-api.html">Using the Ambari REST API</a>
</li>
</ul>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/admin/startstop.html">Starting and Stopping HAWQ</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/admin/ClusterExpansion.html">Expanding a Cluster</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/admin/ClusterShrink.html">Removing a Node</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/admin/BackingUpandRestoringHAWQDatabases.html">Backing Up and Restoring HAWQ</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/admin/HighAvailability.html">High Availability in HAWQ</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/admin/MasterMirroring.html">Master Mirroring</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/admin/HAWQFilespacesandHighAvailabilityEnabledHDFS.html">HAWQ Filespaces and High Availability Enabled HDFS</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/admin/FaultTolerance.html">Understanding the Fault Tolerance Service</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/admin/RecommendedMonitoringTasks.html">Recommended Monitoring and Maintenance Tasks</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/admin/maintain.html">Routine System Maintenance Tasks</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/admin/monitor.html">Monitoring a HAWQ System</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/admin/logfiles.html">HAWQ Administrative Log Files</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/admin/packcore.html">HAWQ Packcore Utility</a>
</li>
</ul>
</li>
<li class="has_submenu">
<span>
Managing Resources
</span>
<ul>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/resourcemgmt/HAWQResourceManagement.html">How HAWQ Manages Resources</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/resourcemgmt/best-practices.html">Best Practices for Configuring Resource Management</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/resourcemgmt/ConfigureResourceManagement.html">Configuring Resource Management</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/resourcemgmt/YARNIntegration.html">Integrating YARN with HAWQ</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/resourcemgmt/ResourceQueues.html">Working with Hierarchical Resource Queues</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/resourcemgmt/ResourceManagerStatus.html">Analyzing Resource Manager Status</a>
</li>
</ul>
</li>
<li class="has_submenu">
<span>
Managing Client Access
</span>
<ul>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/clientaccess/client_auth.html">Configuring Client Authentication</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/clientaccess/ldap.html">Using LDAP Authentication with TLS/SSL</a>
</li>
<li class="has_submenu">
<a href="/docs/userguide/2.3.0.0-incubating/clientaccess/kerberos.html">Using Kerberos Authentication</a>
<ul>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/clientaccess/kerberos-securehdfs.html">Configuring HAWQ/PXF for Secure HDFS</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/clientaccess/kerberos-userauth.html">Configuring Kerberos User Authentication for HAWQ</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/clientaccess/kerberos-mitkdc.html">Example - Setting up an MIT KDC Server</a>
</li>
</ul>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/clientaccess/disable-kerberos.html">Disabling Kerberos Security</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/clientaccess/hawq-access-checks.html">Overview of HAWQ Authorization</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/clientaccess/roles_privs.html">Using HAWQ Native Authorization</a>
</li>
<li class="has_submenu">
<span>
Using Ranger for Authorization
</span>
<ul>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/ranger/ranger-overview.html">Overview of Ranger Policy Management</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/ranger/ranger-integration-config.html">Configuring HAWQ to use Ranger Policy Management</a>
</li>
<li class="has_submenu">
<a href="/docs/userguide/2.3.0.0-incubating/ranger/ranger-policy-creation.html">Creating HAWQ Authorization Policies in Ranger</a>
<ul>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/ranger/ranger-resource-perms.html">HAWQ Resources and Permissions</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/ranger/ranger-sqlcmd-summary.html">SQL Command Permissions Summary</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/ranger/madlib-ranger.html">Using MADLib with Ranger Authorization</a>
</li>
</ul>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/ranger/ranger-auditing.html">Auditing Authorization Events</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/ranger/ranger-ha.html">High Availability and HAWQ Ranger</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/ranger/ranger-kerberos.html">HAWQ Ranger Kerberos Integration</a>
</li>
</ul>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/clientaccess/g-establishing-a-database-session.html">Establishing a Database Session</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/clientaccess/g-hawq-database-client-applications.html">HAWQ Client Applications</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/clientaccess/g-connecting-with-psql.html">Connecting with psql</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/clientaccess/g-database-application-interfaces.html">HAWQ Database Drivers and APIs</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/clientaccess/g-troubleshooting-connection-problems.html">Troubleshooting Connection Problems</a>
</li>
</ul>
</li>
<li class="has_submenu">
<span>
Defining Database Objects
</span>
<ul>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/ddl/ddl.html">Overview</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/ddl/ddl-database.html">Creating and Managing Databases</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/ddl/ddl-tablespace.html">Creating and Managing Tablespaces</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/ddl/ddl-schema.html">Creating and Managing Schemas</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/ddl/ddl-table.html">Creating and Managing Tables</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/ddl/locate-table-hdfs.html"> Identifying HAWQ Table HDFS Files</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/ddl/ddl-storage.html">Choosing the Table Storage Model</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/ddl/ddl-partition.html">Partitioning Large Tables</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/ddl/ddl-view.html">Creating and Managing Views</a>
</li>
</ul>
</li>
<li class="has_submenu">
<span>
Using Procedural Languages
</span>
<ul>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/plext/UsingProceduralLanguages.html">Using Languages in HAWQ</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/plext/builtin_langs.html">Using HAWQ Built-In Languages</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/plext/using_pljava.html">Using PL/Java</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/plext/using_plpgsql.html">Using PL/pgSQL</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/plext/using_plpython.html">Using PL/Python</a>
</li>
<li>
<a href="/docs/userguide/2.3.0.0-incubating/plext/using_plr.html">Using PL/R</a>
</li>
</ul>
</li>
<li class="has_submenu"><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/dml.html">Managing Data with HAWQ</a>
<ul>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/BasicDataOperations.html">Basic Data Operations</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/about_statistics.html">About Database Statistics</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/ConcurrencyControl.html">Concurrency Control</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/Transactions.html">Working with Transactions</a></li>
<li class="has_submenu"><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-loading-and-unloading-data.html">Loading and Unloading Data</a>
<ul>
<li class="has_submenu"><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-working-with-file-based-ext-tables.html">Working with File-Based External Tables</a>
<ul>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-external-tables.html">Accessing File-Based External Tables</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-gpfdist-protocol.html">gpfdist Protocol</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-gpfdists-protocol.html">gpfdists Protocol</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-handling-errors-ext-table-data.html">Handling Errors in External Table Data</a></li>
</ul>
</li>
<li class="has_submenu"><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-using-the-hawq-file-server--gpfdist-.html">Using the HAWQ File Server (gpfdist)</a>
<ul>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-about-gpfdist-setup-and-performance.html">About gpfdist Setup and Performance</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-controlling-segment-parallelism.html">Controlling Segment Parallelism</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-installing-gpfdist.html">Installing gpfdist</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-starting-and-stopping-gpfdist.html">Starting and Stopping gpfdist</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-troubleshooting-gpfdist.html">Troubleshooting gpfdist</a></li>
</ul>
</li>
<li class="has_submenu"><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-creating-and-using-web-external-tables.html">Creating and Using Web External Tables</a>
<ul>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-command-based-web-external-tables.html">Command-based Web External Tables</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-url-based-web-external-tables.html">URL-based Web External Tables</a></li>
</ul>
</li>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-loading-data-using-an-external-table.html">Loading Data Using an External Table</a></li>
<li class="has_submenu"><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-loading-and-writing-non-hdfs-custom-data.html">Loading and Writing Non-HDFS Custom Data</a>
<ul>
<li class="has_submenu"><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-using-a-custom-format.html">Using a Custom Format</a>
<ul>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-importing-and-exporting-fixed-width-data.html">Importing and Exporting Fixed Width Data</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-examples-read-fixed-width-data.html">Examples - Read Fixed-Width Data</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/creating-external-tables-examples.html">Creating External Tables - Examples</a>
</li>
<li class="has_submenu"><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-handling-load-errors.html">Handling Load Errors</a>
<ul>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-define-an-external-table-with-single-row-error-isolation.html">Define an External Table with Single Row Error Isolation</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-create-an-error-table-and-declare-a-reject-limit.html">Capture Row Formatting Errors and Declare a Reject Limit </a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-identifying-invalid-csv-files-in-error-table-data.html">Identifying Invalid CSV Files in Error Table Data</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-moving-data-between-tables.html">Moving Data between Tables</a></li>
</ul>
</li>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-register_files.html">Registering Files into HAWQ Internal Tables</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-loading-data-with-hawqload.html">Loading Data with hawq load</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-loading-data-with-copy.html">Loading Data with COPY</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-running-copy-in-single-row-error-isolation-mode.html">Running COPY in Single Row Error Isolation Mode</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-optimizing-data-load-and-query-performance.html">Optimizing Data Load and Query Performance</a></li>
<li class="has_submenu"><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-unloading-data-from-hawq-database.html">Unloading Data from HAWQ</a>
<ul>
<li class="has_submenu"><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-defining-a-file-based-writable-external-table.html">Defining a File-Based Writable External Table</a>
<ul>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-example-hawq-file-server-gpfdist.html">Example - HAWQ file server (gpfdist)</a></li>
</ul>
</li>
<li class="has_submenu"><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-defining-a-command-based-writable-external-web-table.html">Defining a Command-Based Writable External Web Table</a>
<ul>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-disabling-execute-for-web-or-writable-external-tables.html">Disabling EXECUTE for Web or Writable External Tables</a></li>
</ul>
</li>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-unloading-data-using-a-writable-external-table.html">Unloading Data Using a Writable External Table</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-unloading-data-using-copy.html">Unloading Data Using COPY</a></li>
</ul>
</li>
<li class="has_submenu"><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-transforming-xml-data.html">Transforming XML Data</a>
<ul>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-determine-the-transformation-schema.html">Determine the Transformation Schema</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-write-a-transform.html">Write a Transform</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-write-the-gpfdist-configuration.html">Write the gpfdist Configuration</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-load-the-data.html">Load the Data</a></li>
<li class="has_submenu"><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-transfer-and-store-the-data.html">Transfer and Store the Data</a>
<ul>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-transforming-with-gpload.html">Transforming with GPLOAD</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-transforming-with-insert-into-select-from.html">Transforming with INSERT INTO SELECT FROM</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-configuration-file-format.html">Configuration File Format</a></li>
</ul>
</li>
<li class="has_submenu"><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-xml-transformation-examples.html">XML Transformation Examples</a>
<ul>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-example-1-dblp-database-publications-in-demo-directory.html">Command-based Web External Tables</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-example-irs-mef-xml-files-in-demo-directory.html">Example using IRS MeF XML Files (In demo Directory)</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-example-witsml-files-in-demo-directory.html">Example using WITSMLâ„¢ Files (In demo Directory)</a></li>
</ul>
</li>
</ul>
</li>
<li class="has_submenu"><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-formatting-data-files.html">Formatting Data Files</a>
<ul>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-formatting-rows.html">Formatting Rows</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-formatting-columns.html">Formatting Columns</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-representing-null-values.html">Representing NULL Values</a></li>
<li class="has_submenu"><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-escaping.html">Escaping</a>
<ul>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-escaping-in-text-formatted-files.html">Escaping in Text Formatted Files</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-escaping-in-csv-formatted-files.html">Escaping in CSV Formatted Files</a></li>
</ul>
</li>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/load/g-character-encoding.html">Character Encoding</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="/docs/userguide/2.3.0.0-incubating/datamgmt/HAWQInputFormatforMapReduce.html">HAWQ InputFormat for MapReduce</a></li>
</ul>
</li>
<li class="has_submenu"><a href="/docs/userguide/2.3.0.0-incubating/pxf/HawqExtensionFrameworkPXF.html">Using PXF with Unmanaged Data</a>
<ul>
<li><a href="/docs/userguide/2.3.0.0-incubating/pxf/InstallPXFPlugins.html">Installing PXF Plugins</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/pxf/ConfigurePXF.html">Configuring PXF</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/pxf/HDFSFileDataPXF.html">Accessing HDFS File Data</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/pxf/HivePXF.html">Accessing Hive Data</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/pxf/HBasePXF.html">Accessing HBase Data</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/pxf/JsonPXF.html">Accessing JSON Data</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/pxf/JdbcPXF.html">Accessing External SQL Databases</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/pxf/HDFSWritablePXF.html">Writing Data to HDFS</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/pxf/ReadWritePXF.html">Using Profiles to Read and Write Data</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/pxf/PXFExternalTableandAPIReference.html">PXF External Tables and API</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/pxf/TroubleshootingPXF.html">Troubleshooting PXF</a></li>
</ul>
</li>
<li class="has_submenu"><a href="/docs/userguide/2.3.0.0-incubating/query/query.html">Querying Data</a>
<ul>
<li><a href="/docs/userguide/2.3.0.0-incubating/query/HAWQQueryProcessing.html">About HAWQ Query Processing</a></li>
<li class="has_submenu"><a href="/docs/userguide/2.3.0.0-incubating/query/gporca/query-gporca-optimizer.html">About GPORCA</a>
<ul>
<li><a href="/docs/userguide/2.3.0.0-incubating/query/gporca/query-gporca-overview.html">Overview of GPORCA</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/query/gporca/query-gporca-features.html">GPORCA Features and Enhancements</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/query/gporca/query-gporca-enable.html">Enabling GPORCA</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/query/gporca/query-gporca-notes.html">Considerations when Using GPORCA</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/query/gporca/query-gporca-fallback.html">Determining The Query Optimizer In Use</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/query/gporca/query-gporca-changed.html">Changed Behavior with GPORCA</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/query/gporca/query-gporca-limitations.html">GPORCA Limitations</a></li>
</ul>
</li>
<li><a href="/docs/userguide/2.3.0.0-incubating/query/defining-queries.html">Defining Queries</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/query/functions-operators.html">Using Functions and Operators</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/query/query-performance.html">Query Performance</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/query/query-profiling.html">Query Profiling</a></li>
</ul>
</li>
<li class="has_submenu"><a href="/docs/userguide/2.3.0.0-incubating/bestpractices/HAWQBestPracticesOverview.html">Best Practices</a>
<ul>
<li><a href="/docs/userguide/2.3.0.0-incubating/bestpractices/config_hawq_bestpractices.html">Configuring HAWQ</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/bestpractices/operating_hawq_bestpractices.html">Operating HAWQ</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/bestpractices/secure_bestpractices.html">Securing HAWQ</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/bestpractices/managing_resources_bestpractices.html">Managing Resources</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/bestpractices/managing_data_bestpractices.html">Managing Data</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/bestpractices/querying_data_bestpractices.html">Querying Data</a></li>
</ul>
</li>
<li class="has_submenu"><a href="/docs/userguide/2.3.0.0-incubating/troubleshooting/Troubleshooting.html">Troubleshooting</a>
<ul>
<li><a href="/docs/userguide/2.3.0.0-incubating/troubleshooting/Troubleshooting.html#topic_dwd_rnx_15">Query Performance Issues</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/troubleshooting/Troubleshooting.html#topic_vm5_znx_15">Rejection of Query Resource Requests</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/troubleshooting/Troubleshooting.html#topic_qq4_rkl_wv">Queries Cancelled Due to High VMEM Usage</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/troubleshooting/Troubleshooting.html#topic_hlj_zxx_15">Segments Do Not Appear in gp_segment_configuration</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/troubleshooting/Troubleshooting.html#topic_mdz_q2y_15">Handling Segment Resource Fragmentation</a></li>
</ul>
</li>
<li class="has_submenu"><a href="/docs/userguide/2.3.0.0-incubating/reference/hawq-reference.html">HAWQ Reference</a>
<ul>
<li class="has_submenu"><a href="/docs/userguide/2.3.0.0-incubating/reference/SQLCommandReference.html">SQL Commands</a>
<ul>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/ABORT.html">ABORT</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/ALTER-AGGREGATE.html">ALTER AGGREGATE</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/ALTER-CONVERSION.html">ALTER CONVERSION</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/ALTER-DATABASE.html">ALTER DATABASE</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/ALTER-FUNCTION.html">ALTER FUNCTION</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/ALTER-OPERATOR.html">ALTER OPERATOR</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/ALTER-OPERATOR-CLASS.html">ALTER OPERATOR CLASS</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/ALTER-RESOURCE-QUEUE.html">ALTER RESOURCE QUEUE</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/ALTER-ROLE.html">ALTER ROLE</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/ALTER-SEQUENCE.html">ALTER SEQUENCE</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/ALTER-TABLE.html">ALTER TABLE</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/ALTER-TABLESPACE.html">ALTER TABLESPACE</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/ALTER-TYPE.html">ALTER TYPE</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/ALTER-USER.html">ALTER USER</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/ANALYZE.html">ANALYZE</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/BEGIN.html">BEGIN</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/CHECKPOINT.html">CHECKPOINT</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/CLOSE.html">CLOSE</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/COMMIT.html">COMMIT</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/COPY.html">COPY</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/CREATE-AGGREGATE.html">CREATE AGGREGATE</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/CREATE-CAST.html">CREATE CAST</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/CREATE-CONVERSION.html">CREATE CONVERSION</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/CREATE-DATABASE.html">CREATE DATABASE</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/CREATE-EXTERNAL-TABLE.html">CREATE EXTERNAL TABLE</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/CREATE-FUNCTION.html">CREATE FUNCTION</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/CREATE-GROUP.html">CREATE GROUP</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/CREATE-LANGUAGE.html">CREATE LANGUAGE</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/CREATE-OPERATOR.html">CREATE OPERATOR</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/CREATE-OPERATOR-CLASS.html">CREATE OPERATOR CLASS</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/CREATE-RESOURCE-QUEUE.html">CREATE RESOURCE QUEUE</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/CREATE-ROLE.html">CREATE ROLE</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/CREATE-SCHEMA.html">CREATE SCHEMA</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/CREATE-SEQUENCE.html">CREATE SEQUENCE</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/CREATE-TABLE.html">CREATE TABLE</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/CREATE-TABLE-AS.html">CREATE TABLE AS</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/CREATE-TABLESPACE.html">CREATE TABLESPACE</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/CREATE-TYPE.html">CREATE TYPE</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/CREATE-USER.html">CREATE USER</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/CREATE-VIEW.html">CREATE VIEW</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/DEALLOCATE.html">DEALLOCATE</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/DECLARE.html">DECLARE</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/DROP-AGGREGATE.html">DROP AGGREGATE</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/DROP-CAST.html">DROP CAST</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/DROP-CONVERSION.html">DROP CONVERSION</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/DROP-DATABASE.html">DROP DATABASE</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/DROP-EXTERNAL-TABLE.html">DROP EXTERNAL TABLE</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/DROP-FILESPACE.html">DROP FILESPACE</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/DROP-FUNCTION.html">DROP FUNCTION</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/DROP-GROUP.html">DROP GROUP</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/DROP-LANGUAGE.html">DROP LANGUAGE</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/DROP-OPERATOR.html">DROP OPERATOR</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/DROP-OPERATOR-CLASS.html">DROP OPERATOR CLASS</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/DROP-OWNED.html">DROP OWNED</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/DROP-RESOURCE-QUEUE.html">DROP RESOURCE QUEUE</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/DROP-ROLE.html">DROP ROLE</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/DROP-SCHEMA.html">DROP SCHEMA</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/DROP-SEQUENCE.html">DROP SEQUENCE</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/DROP-TABLE.html">DROP TABLE</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/DROP-TABLESPACE.html">DROP TABLESPACE</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/DROP-TYPE.html">DROP TYPE</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/DROP-USER.html">DROP USER</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/DROP-VIEW.html">DROP VIEW</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/END.html">END</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/EXECUTE.html">EXECUTE</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/EXPLAIN.html">EXPLAIN</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/FETCH.html">FETCH</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/GRANT.html">GRANT</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/INSERT.html">INSERT</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/PREPARE.html">PREPARE</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/REASSIGN-OWNED.html">REASSIGN OWNED</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/RELEASE-SAVEPOINT.html">RELEASE SAVEPOINT</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/RESET.html">RESET</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/REVOKE.html">REVOKE</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/ROLLBACK.html">ROLLBACK</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/ROLLBACK-TO-SAVEPOINT.html">ROLLBACK TO SAVEPOINT</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/SAVEPOINT.html">SAVEPOINT</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/SELECT.html">SELECT</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/SELECT-INTO.html">SELECT INTO</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/SET.html">SET</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/SET-ROLE.html">SET ROLE</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/SET-SESSION-AUTHORIZATION.html">SET SESSION AUTHORIZATION</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/SHOW.html">SHOW</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/TRUNCATE.html">TRUNCATE</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/sql/VACUUM.html">VACUUM</a></li>
</ul>
</li>
<li class="has_submenu"><a href="/docs/userguide/2.3.0.0-incubating/reference/HAWQSiteConfig.html">Server Configuration Parameter Reference</a>
<ul>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/guc_config.html">About Server Configuration Parameters</a></li>
<li class="has_submenu"><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/guc_category-list.html">Configuration Parameter Categories</a>
<ul>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/guc_category-list.html#topic_hfd_1tl_zp">Append-Only Table Parameters</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/guc_category-list.html#topic39">Client Connection Default Parameters</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/guc_category-list.html#topic12">Connection and Authentication Parameters</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/guc_category-list.html#topic47">Database and Tablespace/Filespace Parameters</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/guc_category-list.html#topic29">Error Reporting and Logging Parameters</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/guc_category-list.html#topic45">External Table Parameters</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/guc_category-list.html#topic57">GPORCA Parameters</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/guc_category-list.html#topic49">HAWQ Array Configuration Parameters</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/guc_category-list.html#topic_pxfparam">HAWQ Extension Framework (PXF) Parameters</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/guc_category-list.html#topic56">HAWQ PL/Java Extension Parameters</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/guc_category-list.html#hawq_resource_management">HAWQ Resource Management Parameters</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/guc_category-list.html#topic43">Lock Management Parameters</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/guc_category-list.html#topic48">Past PostgreSQL Version Compatibility Parameters</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/guc_category-list.html#topic21">Query Tuning Parameters</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/guc_category-list.html#ranger_related">Ranger Configuration Parameters</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/guc_category-list.html#statistics_collection">Statistics Collection Parameters</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/guc_category-list.html#topic15">System Resource Consumption Parameters</a></li>
</ul>
</li>
<li class="has_submenu"><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html">Configuration Parameters</a>
<ul>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#add_missing_from">add_missing_from</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#application_name">application_name</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#array_nulls">array_nulls</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#authentication_timeout">authentication_timeout</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#backslash_quote">backslash_quote</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#block_size">block_size</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#bonjour_name">bonjour_name</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#check_function_bodies">check_function_bodies</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#client_encoding">client_encoding</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#client_min_messages">client_min_messages</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#cpu_index_tuple_cost">cpu_index_tuple_cost</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#cpu_operator_cost">cpu_operator_cost</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#cpu_tuple_cost">cpu_tuple_cost</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#cursor_tuple_fraction">cursor_tuple_fraction</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#custom_variable_classes">custom_variable_classes</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#DateStyle">DateStyle</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#db_user_namespace">db_user_namespace</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#deadlock_timeout">deadlock_timeout</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#debug_assertions">debug_assertions</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#debug_pretty_print">debug_pretty_print</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#debug_print_parse">debug_print_parse</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#debug_print_plan">debug_print_plan</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#debug_print_prelim_plan">debug_print_prelim_plan</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#debug_print_rewritten">debug_print_rewritten</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#debug_print_slice_table">debug_print_slice_table</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#topic_fqj_4fd_kv">default_hash_table_bucket_number</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#default_statistics_target">default_statistics_target</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#default_tablespace">default_tablespace</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#default_transaction_isolation">default_transaction_isolation</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#default_transaction_read_only">default_transaction_read_only</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#dynamic_library_path">dynamic_library_path</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#effective_cache_size">effective_cache_size</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#enable_bitmapscan">enable_bitmapscan</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#enable_groupagg">enable_groupagg</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#enable_hashagg">enable_hashagg</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#enable_hashjoin">enable_hashjoin</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#enable_indexscan">enable_indexscan</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#enable_mergejoin">enable_mergejoin</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#enable_nestloop">enable_nestloop</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#enable_seqscan">enable_seqscan</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#enable_sort">enable_sort</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#enable_tidscan">enable_tidscan</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#escape_string_warning">escape_string_warning</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#explain_pretty_print">explain_pretty_print</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#extra_float_digits">extra_float_digits</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#from_collapse_limit">from_collapse_limit</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_adjust_selectivity_for_outerjoins">gp_adjust_selectivity_for_outerjoins</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_analyze_relative_error">gp_analyze_relative_error</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_autostats_mode">gp_autostats_mode</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#topic_imj_zhf_gw">gp_autostats_on_change_threshhold</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_backup_directIO">gp_backup_directIO</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_backup_directIO_read_chunk_mb">gp_backup_directIO_read_chunk_mb</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_cached_segworkers_threshold">gp_cached_segworkers_threshold</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_command_count">gp_command_count</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_connections_per_thread">gp_connections_per_thread</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_debug_linger">gp_debug_linger</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_dynamic_partition_pruning">gp_dynamic_partition_pruning</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_enable_agg_distinct">gp_enable_agg_distinct</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_enable_agg_distinct_pruning">gp_enable_agg_distinct_pruning</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_enable_direct_dispatch">gp_enable_direct_dispatch</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_enable_fallback_plan">gp_enable_fallback_plan</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_enable_fast_sri">gp_enable_fast_sri</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_enable_groupext_distinct_gather">gp_enable_groupext_distinct_gather</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_enable_groupext_distinct_pruning">gp_enable_groupext_distinct_pruning</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_enable_multiphase_agg">gp_enable_multiphase_agg</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_enable_predicate_propagation">gp_enable_predicate_propagation</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_enable_preunique">gp_enable_preunique</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_enable_sequential_window_plans">gp_enable_sequential_window_plans</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_enable_sort_distinct">gp_enable_sort_distinct</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_enable_sort_limit">gp_enable_sort_limit</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_external_enable_exec">gp_external_enable_exec</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_external_grant_privileges">gp_external_grant_privileges</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_external_max_segs">gp_external_max_segs</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_filerep_tcp_keepalives_count">gp_filerep_tcp_keepalives_count</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_filerep_tcp_keepalives_idle">gp_filerep_tcp_keepalives_idle</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_filerep_tcp_keepalives_interval">gp_filerep_tcp_keepalives_interval</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_hashjoin_tuples_per_bucket">gp_hashjoin_tuples_per_bucket</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_idf_deduplicate">gp_idf_deduplicate</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_interconnect_cache_future_packets">gp_interconnect_cache_future_packets</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_interconnect_default_rtt">gp_interconnect_default_rtt</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_interconnect_fc_method">gp_interconnect_fc_method</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_interconnect_hash_multiplier">gp_interconnect_hash_multiplier</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_interconnect_min_retries_before_timeout">gp_interconnect_min_retries_before_timeout</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_interconnect_min_rto">gp_interconnect_min_rto</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_interconnect_queue_depth">gp_interconnect_queue_depth</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_interconnect_setup_timeout">gp_interconnect_setup_timeout</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_interconnect_snd_queue_depth">gp_interconnect_snd_queue_depth</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_interconnect_timer_checking_period">gp_interconnect_timer_checking_period</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_interconnect_timer_period">gp_interconnect_timer_period</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_interconnect_type">gp_interconnect_type</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_log_format">gp_log_format</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_max_csv_line_length">gp_max_csv_line_length</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_max_databases">gp_max_databases</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_max_filespaces">gp_max_filespaces</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_max_packet_size">gp_max_packet_size</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_max_plan_size">gp_max_plan_size</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_max_tablespaces">gp_max_tablespaces</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_motion_cost_per_row">gp_motion_cost_per_row</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_reject_percent_threshold">gp_reject_percent_threshold</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_reraise_signal">gp_reraise_signal</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_role">gp_role</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_safefswritesize">gp_safefswritesize</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_segment_connect_timeout">gp_segment_connect_timeout</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_segments_for_planner">gp_segments_for_planner</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_session_id">gp_session_id</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_set_proc_affinity">gp_set_proc_affinity</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_set_read_only">gp_set_read_only</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_statistics_pullup_from_child_partition">gp_statistics_pullup_from_child_partition</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_statistics_use_fkeys">gp_statistics_use_fkeys</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_vmem_idle_resource_timeout">gp_vmem_idle_resource_timeout</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_vmem_protect_segworker_cache_limit">gp_vmem_protect_segworker_cache_limit</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_workfile_checksumming">gp_workfile_checksumming</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_workfile_compress_algorithm">gp_workfile_compress_algorithm</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_workfile_limit_files_per_query">gp_workfile_limit_files_per_query</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_workfile_limit_per_query">gp_workfile_limit_per_query</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#gp_workfile_limit_per_segment">gp_workfile_limit_per_segment</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#hawq_acl_type">hawq_acl_type</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#hawq_dfs_url">hawq_dfs_url</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#hawq_global_rm_type">hawq_global_rm_type</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#hawq_master_address_host">hawq_master_address_host</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#hawq_master_address_port">hawq_master_address_port</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#hawq_master_directory">hawq_master_directory</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#hawq_master_temp_directory">hawq_master_temp_directory</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#hawq_re_memory_overcommit_max">hawq_re_memory_overcommit_max</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#hawq_rm_cluster_report">hawq_rm_cluster_report_period</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#hawq_rm_force_alterqueue_cancel_queued_request">hawq_rm_force_alterqueue_cancel_queued_request</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#hawq_rm_master_port">hawq_rm_master_port</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#hawq_rm_memory_limit_perseg">hawq_rm_memory_limit_perseg</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#hawq_rm_min_resource_perseg">hawq_rm_min_resource_perseg</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#hawq_rm_nresqueue_limit">hawq_rm_nresqueue_limit</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#hawq_rm_nslice_perseg_limit">hawq_rm_nslice_perseg_limit</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#hawq_rm_nvcore_limit_perseg">hawq_rm_nvcore_limit_perseg</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#hawq_rm_nvseg_perquery_limit">hawq_rm_nvseg_perquery_limit</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#hawq_rm_nvseg_perquery_perseg_limit">hawq_rm_nvseg_perquery_perseg_limit</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#hawq_rm_nvseg_variance_amon_seg_limit">hawq_rm_nvseg_variance_amon_seg_limit</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#hawq_rm_rejectrequest_nseg_limit">hawq_rm_rejectrequest_nseg_limit</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#hawq_rm_resource_idle_timeout">hawq_rm_resource_idle_timeout</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#hawq_rm_return_percent_on_overcommit">hawq_rm_return_percent_on_overcommit</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#hawq_rm_segment_heartbeat_interval">hawq_rm_segment_heartbeat_interval</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#hawq_rm_segment_port">hawq_rm_segment_port</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#hawq_rm_stmt_nvseg">hawq_rm_stmt_nvseg</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#hawq_rm_stmt_vseg_memory">hawq_rm_stmt_vseg_memory</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#hawq_rm_tolerate_nseg_limit">hawq_rm_tolerate_nseg_limit</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#hawq_rm_yarn_address">hawq_rm_yarn_address</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#hawq_rm_yarn_app_name">hawq_rm_yarn_app_name</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#hawq_rm_yarn_queue_name">hawq_rm_yarn_queue_name</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#hawq_rm_yarn_scheduler_address">hawq_rm_yarn_scheduler_address</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#hawq_rps_address_port">hawq_rps_address_port</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#hawq_rps_check_local_interval">hawq_rps_check_local_interval</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#hawq_segment_address_port">hawq_segment_address_port</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#hawq_segment_directory">hawq_segment_directory</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#hawq_segment_temp_directory">hawq_segment_temp_directory</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#integer_datetimes">integer_datetimes</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#IntervalStyle">IntervalStyle</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#join_collapse_limit">join_collapse_limit</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#krb_caseins_users">krb_caseins_users</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#krb_server_keyfile">krb_server_keyfile</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#krb_srvname">krb_srvname</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#lc_collate">lc_collate</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#lc_ctype">lc_ctype</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#lc_messages">lc_messages</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#lc_monetary">lc_monetary</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#lc_numeric">lc_numeric</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#lc_time">lc_time</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#listen_addresses">listen_addresses</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#local_preload_libraries">local_preload_libraries</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#log_autostats">log_autostats</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#log_connections">log_connections</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#log_disconnections">log_disconnections</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#log_dispatch_stats">log_dispatch_stats</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#log_duration">log_duration</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#log_error_verbosity">log_error_verbosity</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#log_executor_stats">log_executor_stats</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#log_hostname">log_hostname</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#log_min_duration_statement">log_min_duration_statement</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#log_min_error_statement">log_min_error_statement</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#log_min_messages">log_min_messages</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#log_parser_stats">log_parser_stats</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#log_planner_stats">log_planner_stats</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#log_rotation_age">log_rotation_age</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#log_rotation_size">log_rotation_size</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#log_statement">log_statement</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#log_statement_stats">log_statement_stats</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#log_timezone">log_timezone</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#log_truncate_on_rotation">log_truncate_on_rotation</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#max_appendonly_tables">max_appendonly_tables</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#max_connections">max_connections</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#max_files_per_process">max_files_per_process</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#max_fsm_pages">max_fsm_pages</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#max_fsm_relations">max_fsm_relations</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#max_function_args">max_function_args</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#max_identifier_length">max_identifier_length</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#max_index_keys">max_index_keys</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#max_locks_per_transaction">max_locks_per_transaction</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#max_prepared_transactions">max_prepared_transactions</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#max_stack_depth">max_stack_depth</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#optimizer">optimizer</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#optimizer_analyze_root_partition">optimizer_analyze_root_partition</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#optimizer_minidump">optimizer_minidump</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#optimizer_parts_to_force_sort_on_insert">optimizer_parts_to_force_sort_on_insert</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#optimizer_prefer_scalar_dqa_multistage_agg">optimizer_prefer_scalar_dqa_multistage_agg</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#password_encryption">password_encryption</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#pgstat_track_activity_query_size">pgstat_track_activity_query_size</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#pljava_classpath">pljava_classpath</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#pljava_statement_cache_size">pljava_statement_cache_size</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#pljava_release_lingering_savepoints">pljava_release_lingering_savepoints</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#pljava_vmoptions">pljava_vmoptions</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#port">port</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#pxf_enable_filter_pushdown">pxf_enable_filter_pushdown</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#pxf_enable_stat_collection">pxf_enable_stat_collection</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#pxf_remote_service_login">pxf_remote_service_login</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#pxf_remote_service_secret">pxf_remote_service_secret</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#pxf_service_address">pxf_service_address</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#pxf_service_port">pxf_service_port</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#pxf_stat_max_fragments">pxf_stat_max_fragments</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#random_page_cost">random_page_cost</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#regex_flavor">regex_flavor</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#runaway_detector_activation_percent">runaway_detector_activation_percent</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#search_path">search_path</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#seg_max_connections">seg_max_connections</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#seq_page_cost">seq_page_cost</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#server_encoding">server_encoding</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#server_ticket_renew_interval">server_ticket_renew_interval</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#server_version">server_version</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#server_version_num">server_version_num</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#shared_buffers">shared_buffers</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#shared_preload_libraries">shared_preload_libraries</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#ssl">ssl</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#ssl_ciphers">ssl_ciphers</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#standard_conforming_strings">standard_conforming_strings</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#statement_timeout">statement_timeout</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#superuser_reserved_connections">superuser_reserved_connections</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#tcp_keepalives_count">tcp_keepalives_count</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#tcp_keepalives_idle">tcp_keepalives_idle</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#tcp_keepalives_interval">tcp_keepalives_interval</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#temp_buffers">temp_buffers</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#TimeZone">TimeZone</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#timezone_abbreviations">timezone_abbreviations</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#track_activities">track_activities</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#track_counts">track_counts</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#transaction_isolation">transaction_isolation</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#transaction_read_only">transaction_read_only</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#transform_null_equals">transform_null_equals</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#unix_socket_directory">unix_socket_directory</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#unix_socket_group">unix_socket_group</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#unix_socket_permissions">unix_socket_permissions</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#update_process_title">update_process_title</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#vacuum_cost_delay">vacuum_cost_delay</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#vacuum_cost_limit">vacuum_cost_limit</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#vacuum_cost_page_dirty">vacuum_cost_page_dirty</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#vacuum_cost_page_miss">vacuum_cost_page_miss</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#vacuum_freeze_min_age">vacuum_freeze_min_age</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/guc/parameter_definitions.html#xid_stop_limit">xid_stop_limit</a></li>
</ul>
</li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/HAWQSampleSiteConfig.html">Sample hawq-site.xml Configuration File</a></li>
</ul>
</li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/HDFSConfigurationParameterReference.html">HDFS Configuration Reference</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/HAWQEnvironmentVariables.html">Environment Variables</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/CharacterSetSupportReference.html">Character Set Support Reference</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/HAWQDataTypes.html">Data Types</a></li>
<li class="has_submenu"><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/catalog_ref.html">System Catalog Reference</a>
<ul>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/catalog_ref-tables.html">System Tables</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/catalog_ref-views.html">System Views</a></li>
<li class="has_submenu"><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/catalog_ref-html.html">System Catalogs Definitions</a>
<ul>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/gp_configuration_history.html">gp_configuration_history</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/gp_distribution_policy.html">gp_distribution_policy</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/gp_global_sequence.html">gp_global_sequence</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/gp_master_mirroring.html">gp_master_mirroring</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/gp_persistent_database_node.html">gp_persistent_database_node</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/gp_persistent_filespace_node.html">gp_persistent_filespace_node</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/gp_persistent_relation_node.html">gp_persistent_relation_node</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/gp_persistent_relfile_node.html">gp_persistent_relfile_node</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/gp_persistent_tablespace_node.html">gp_persistent_tablespace_node</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/gp_relfile_node.html">gp_relfile_node</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/gp_segment_configuration.html">gp_segment_configuration</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/gp_version_at_initdb.html">gp_version_at_initdb</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_aggregate.html">pg_aggregate</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_am.html">pg_am</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_amop.html">pg_amop</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_amproc.html">pg_amproc</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_appendonly.html">pg_appendonly</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_attrdef.html">pg_attrdef</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_attribute.html">pg_attribute</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_attribute_encoding.html">pg_attribute_encoding</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_auth_members.html">pg_auth_members</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_authid.html">pg_authid</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_cast.html">pg_cast</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_class.html">pg_class</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_compression.html">pg_compression</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_constraint.html">pg_constraint</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_conversion.html">pg_conversion</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_database.html">pg_database</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_depend.html">pg_depend</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_description.html">pg_description</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_exttable.html">pg_exttable</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_filespace.html">pg_filespace</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_filespace_entry.html">pg_filespace_entry</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_index.html">pg_index</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_inherits.html">pg_inherits</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_language.html">pg_language</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_largeobject.html">pg_largeobject</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_listener.html">pg_listener</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_locks.html">pg_locks</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_namespace.html">pg_namespace</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_opclass.html">pg_opclass</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_operator.html">pg_operator</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_partition.html">pg_partition</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_partition_columns.html">pg_partition_columns</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_partition_encoding.html">pg_partition_encoding</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_partition_rule.html">pg_partition_rule</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_partition_templates.html">pg_partition_templates</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_partitions.html">pg_partitions</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_pltemplate.html">pg_pltemplate</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_proc.html">pg_proc</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_resqueue.html">pg_resqueue</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_resqueue_status.html">pg_resqueue_status</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_rewrite.html">pg_rewrite</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_roles.html">pg_roles</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_shdepend.html">pg_shdepend</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_shdescription.html">pg_shdescription</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_stat_activity.html">pg_stat_activity</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_stat_last_operation.html">pg_stat_last_operation</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_stat_last_shoperation.html">pg_stat_last_shoperation</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_stat_operations.html">pg_stat_operations</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_stat_partition_operations.html">pg_stat_partition_operations</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_statistic.html">pg_statistic</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_stats.html">pg_stats</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_tablespace.html">pg_tablespace</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_trigger.html">pg_trigger</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_type.html">pg_type</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_type_encoding.html">pg_type_encoding</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/catalog/pg_window.html">pg_window</a></li>
</ul>
</li>
</ul>
</li>
<li class="has_submenu"><a href="/docs/userguide/2.3.0.0-incubating/reference/toolkit/hawq_toolkit.html">The hawq_toolkit Administrative Schema</a>
<ul>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/toolkit/hawq_toolkit.html#topic2">Checking for Tables that Need Routine Maintenance</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/toolkit/hawq_toolkit.html#topic16">Viewing HAWQ Server Log Files</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/toolkit/hawq_toolkit.html#topic38">Checking Database Object Sizes and Disk Space</a></li>
</ul>
</li>
<li class="has_submenu"><a href="/docs/userguide/2.3.0.0-incubating/reference/cli/management_tools.html">HAWQ Management Tools Reference</a>
<ul>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/cli/admin_utilities/analyzedb.html">analyzedb</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/cli/client_utilities/createdb.html">createdb</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/cli/client_utilities/createuser.html">createuser</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/cli/client_utilities/dropdb.html">dropdb</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/cli/client_utilities/dropuser.html">dropuser</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/cli/admin_utilities/gpfdist.html">gpfdist</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/cli/admin_utilities/gplogfilter.html">gplogfilter</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/cli/admin_utilities/hawqactivate.html">hawq activate</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/cli/admin_utilities/hawqcheck.html">hawq check</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/cli/admin_utilities/hawqcheckperf.html">hawq checkperf</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/cli/admin_utilities/hawqconfig.html">hawq config</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/cli/admin_utilities/hawqextract.html">hawq extract</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/cli/admin_utilities/hawqfilespace.html">hawq filespace</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/cli/admin_utilities/hawqinit.html">hawq init</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/cli/admin_utilities/hawqload.html">hawq load</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/cli/admin_utilities/hawqregister.html">hawq register</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/cli/admin_utilities/hawqrestart.html">hawq restart</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/cli/admin_utilities/hawqscp.html">hawq scp</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/cli/admin_utilities/hawqssh.html">hawq ssh</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/cli/admin_utilities/hawqssh-exkeys.html">hawq ssh-exkeys</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/cli/admin_utilities/hawqstart.html">hawq start</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/cli/admin_utilities/hawqstate.html">hawq state</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/cli/admin_utilities/hawqstop.html">hawq stop</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/cli/client_utilities/pg_dump.html">pg_dump</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/cli/client_utilities/pg_dumpall.html">pg_dumpall</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/cli/client_utilities/pg_restore.html">pg_restore</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/cli/client_utilities/psql.html">psql</a></li>
<li><a href="/docs/userguide/2.3.0.0-incubating/reference/cli/client_utilities/vacuumdb.html">vacuumdb</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
<!--end of sub-nav-->
<!--googleon: index-->
<main class="content content-layout" id="js-content" role="main">
<a id="top"></a>
<h1 class="title-container" >
PXF External Tables and API
</h1>
<div id="js-quick-links" >
<div class="quick-links"><ul>
<li><a href="#creatinganexternaltable">Creating an External Table</a></li>
<li>
<a href="#aboutthejavaclassservicesandformats">About the Java Class Services and Formats</a><ul>
<li><a href="#fragmenter">Fragmenter</a></li>
<li><a href="#accessor">Accessor</a></li>
<li><a href="#resolver">Resolver</a></li>
</ul>
</li>
<li><a href="#aboutcustomprofiles">About Custom Profiles</a></li>
<li>
<a href="#aboutqueryfilterpush-down">About Query Filter Push-Down</a><ul>
<li><a href="#filteravailabilityandordering">Filter Availability and Ordering</a></li>
<li><a href="#creatingafilterbuilderclass">Creating a Filter Builder Class</a></li>
<li><a href="#filteroperations">Filter Operations</a></li>
<li><a href="#sampleimplementation">Sample Implementation</a></li>
<li><a href="#usingfilters">Using Filters</a></li>
</ul>
</li>
<li>
<a href="#reference">Examples</a><ul>
<li><a href="#externaltableexamples">External Table Examples</a></li>
<li><a href="#pluginexamples">Plug-in Examples</a></li>
</ul>
</li>
</ul></div>
</div>
<div class="to-top" id="js-to-top">
<a href="#top" title="back to top"></a>
</div>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you 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.
-->
<p>You can use the PXF API to create your own connectors to access any other type of parallel data store or processing engine.</p>
<p>The PXF Java API lets you extend PXF functionality and add new services and formats without changing HAWQ. The API includes three classes that are extended to allow HAWQ to access an external data source: <code>Fragmenter</code>, <code>Accessor</code>, and <code>Resolver</code>.</p>
<p>The <code>Fragmenter</code> produces a list of data fragments that can be read in parallel from the data source. The <code>Accessor</code> produces a list of records from a single fragment, and the <code>Resolver</code> both deserializes and serializes records.</p>
<p>Together, the <code>Fragmenter</code>, <code>Accessor</code>, and <code>Resolver</code> classes implement a connector. PXF includes plug-ins for HDFS and JSON files and tables in HBase and Hive.</p>
<h2 id="creating-an-external-table"><a id="creatinganexternaltable"></a>Creating an External Table</h2>
<p>The syntax for an <code>EXTERNAL TABLE</code> that uses the PXF protocol is as follows:</p>
<pre class="highlight sql"><code><span class="k">CREATE</span> <span class="p">[</span><span class="n">READABLE</span><span class="o">|</span><span class="n">WRITABLE</span><span class="p">]</span> <span class="k">EXTERNAL</span> <span class="k">TABLE</span> <span class="o">&lt;</span><span class="k">table_name</span><span class="o">&gt;</span>
<span class="p">(</span> <span class="o">&lt;</span><span class="k">column_name</span><span class="o">&gt;</span> <span class="o">&lt;</span><span class="n">data_type</span><span class="o">&gt;</span> <span class="p">[,</span> <span class="p">...]</span> <span class="o">|</span> <span class="k">LIKE</span> <span class="o">&lt;</span><span class="n">other_table</span><span class="o">&gt;</span> <span class="p">)</span>
<span class="k">LOCATION</span><span class="p">(</span><span class="s1">'pxf://&lt;host&gt;[:&lt;port&gt;]/&lt;path-to-data&gt;?&lt;pxf-parameters&gt;[&amp;&lt;custom-option&gt;=&lt;value&gt;[...]]'</span><span class="p">)</span>
<span class="n">FORMAT</span> <span class="s1">'custom'</span> <span class="p">(</span><span class="n">formatter</span><span class="o">=</span><span class="s1">'pxfwritable_import|pxfwritable_export'</span><span class="p">);</span>
</code></pre>
<p> where &lt;pxf-parameters&gt; is:</p>
<pre class="highlight plaintext"><code> [FRAGMENTER=&lt;fragmenter_class&gt;&amp;ACCESSOR=&lt;accessor_class&gt;
&amp;RESOLVER=&lt;resolver_class&gt;] | ?PROFILE=profile-name
</code></pre>
<p><strong>Note</strong>: Not every PXF profile supports writable external tables. Refer to <a href="/docs/userguide/2.3.0.0-incubating/pxf/HDFSWritablePXF.html">Writing Data to HDFS</a> for a detailed discussion of the HDFS plug-in profiles that support this feature.</p>
<p><caption><span class="tablecap">Table 1. Parameter values and description</span></caption></p>
<p><a id="creatinganexternaltable__table_pfy_htz_4p"></a></p>
<table><thead>
<tr>
<th>Parameter</th>
<th>Value and description</th>
</tr>
</thead><tbody>
<tr>
<td>&lt;host&gt;</td>
<td>The PXF host. While &lt;host&gt; may identify any PXF agent node, use the HDFS NameNode as it is guaranteed to be available in a running HDFS cluster. If HDFS High Availability is enabled, &lt;host&gt; must identify the HDFS NameService.</td>
</tr>
<tr>
<td>&lt;port&gt;</td>
<td>The PXF port. If &lt;port&gt; is omitted, PXF assumes &lt;host&gt; identifies a High Availability HDFS Nameservice and connects to the port number designated by the <code>pxf_service_port</code> server configuration parameter value. Default is 51200.</td>
</tr>
<tr>
<td>&lt;path-to-data&gt;</td>
<td>A directory, file name, wildcard pattern, table name, etc.</td>
</tr>
<tr>
<td>PROFILE</td>
<td>The profile PXF uses to access the data. PXF supports multiple plug-ins that currently expose profiles named <code>HBase</code>, <code>Hive</code>, <code>HiveRC</code>, <code>HiveText</code>, <code>HiveORC</code>, <code>HiveVectorizedORC</code>, <code>HdfsTextSimple</code>, <code>HdfsTextMulti</code>, <code>Avro</code>, <code>SequenceWritable</code>, and <code>Json</code>.</td>
</tr>
<tr>
<td>FRAGMENTER</td>
<td>The Java class the plug-in uses for fragmenting data. Used for READABLE external tables only.</td>
</tr>
<tr>
<td>ACCESSOR</td>
<td>The Java class the plug-in uses for accessing the data. Used for READABLE and WRITABLE tables.</td>
</tr>
<tr>
<td>RESOLVER</td>
<td>The Java class the plug-in uses for serializing and deserializing the data. Used for READABLE and WRITABLE tables.</td>
</tr>
<tr>
<td>&lt;custom-option&gt;</td>
<td>Additional values to pass to the plug-in at runtime. A plug-in can parse custom options with the PXF helper class <code>org.apache.hawq.pxf.api.utilities.InputData</code>. </td>
</tr>
</tbody></table>
<p><strong>Note:</strong> When creating PXF external tables, you cannot use the <code>HEADER</code> option in your <code>FORMAT</code> specification.</p>
<h2 id="about-the-java-class-services-and-formats"><a id="aboutthejavaclassservicesandformats"></a>About the Java Class Services and Formats</h2>
<p>The <code>LOCATION</code> string in a PXF <code>CREATE EXTERNAL TABLE</code> statement is a URI that specifies the host and port of an external data source and the path to the data in the external data source. The query portion of the URI, introduced by the question mark (?), must include the PXF profile name or the plug-in&rsquo;s <code>FRAGMENTER</code> (readable tables only), <code>ACCESSOR</code>, and <code>RESOLVER</code> class names.</p>
<p>PXF profiles are defined in the <code>/etc/pxf/conf/pxf-profiles.xml</code> file. Profile definitions include plug-in class names. For example, the <code>HdfsTextSimple</code> profile definition is:</p>
<pre class="highlight xml"><code><span class="nt">&lt;profile&gt;</span>
<span class="nt">&lt;name&gt;</span>HdfsTextSimple<span class="nt">&lt;/name&gt;</span>
<span class="nt">&lt;description&gt;</span> This profile is suitable for use when reading delimited
single line records from plain text files on HDFS.
<span class="nt">&lt;/description&gt;</span>
<span class="nt">&lt;plugins&gt;</span>
<span class="nt">&lt;fragmenter&gt;</span>org.apache.hawq.pxf.plugins.hdfs.HdfsDataFragmenter<span class="nt">&lt;/fragmenter&gt;</span>
<span class="nt">&lt;accessor&gt;</span>org.apache.hawq.pxf.plugins.hdfs.LineBreakAccessor<span class="nt">&lt;/accessor&gt;</span>
<span class="nt">&lt;resolver&gt;</span>org.apache.hawq.pxf.plugins.hdfs.StringPassResolver<span class="nt">&lt;/resolver&gt;</span>
<span class="nt">&lt;/plugins&gt;</span>
<span class="nt">&lt;/profile&gt;</span>
</code></pre>
<p>The parameters in the PXF URI are passed from HAWQ as headers to the PXF Java service. You can pass custom information to user-implemented PXF plug-ins by adding optional parameters to the <code>LOCATION</code> string.</p>
<p>The Java PXF service retrieves the source data from the external data source and converts it to a HAWQ-readable table format.</p>
<p>The <code>Accessor</code>, <code>Resolver</code>, and <code>Fragmenter</code> Java classes extend the <code>org.apache.hawq.pxf.api.utilities.Plugin</code> class:</p>
<pre class="highlight java"><code><span class="kn">package</span> <span class="n">org</span><span class="o">.</span><span class="na">apache</span><span class="o">.</span><span class="na">hawq</span><span class="o">.</span><span class="na">pxf</span><span class="o">.</span><span class="na">api</span><span class="o">.</span><span class="na">utilities</span><span class="o">;</span>
<span class="cm">/**
* Base class for all plug-in types (Accessor, Resolver, Fragmenter, ...).
* Manages the meta data.
*/</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">Plugin</span> <span class="o">{</span>
<span class="kd">protected</span> <span class="n">InputData</span> <span class="n">inputData</span><span class="o">;</span>
<span class="cm">/**
* Constructs a plug-in.
*
* @param input the input data
*/</span>
<span class="kd">public</span> <span class="nf">Plugin</span><span class="o">(</span><span class="n">InputData</span> <span class="n">input</span><span class="o">)</span> <span class="o">{</span>
<span class="k">this</span><span class="o">.</span><span class="na">inputData</span> <span class="o">=</span> <span class="n">input</span><span class="o">;</span>
<span class="o">}</span>
<span class="cm">/**
* Checks if the plug-in is thread safe or not, based on inputData.
*
* @return true if plug-in is thread safe
*/</span>
<span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">isThreadSafe</span><span class="o">()</span> <span class="o">{</span>
<span class="k">return</span> <span class="kc">true</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">}</span>
</code></pre>
<p>The parameters in the <code>LOCATION</code> string are available to the plug-ins through methods in the <code>org.apache.hawq.pxf.api.utilities.InputData</code> class. Plug-ins can look up the custom parameters added to the location string with the <code>getUserProperty()</code> method.</p>
<pre class="highlight java"><code><span class="cm">/**
* Common configuration available to all PXF plug-ins. Represents input data
* coming from client applications, such as HAWQ.
*/</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">InputData</span> <span class="o">{</span>
<span class="cm">/**
* Constructs an InputData from a copy.
* Used to create from an extending class.
*
* @param copy the input data to copy
*/</span>
<span class="kd">public</span> <span class="nf">InputData</span><span class="o">(</span><span class="n">InputData</span> <span class="n">copy</span><span class="o">);</span>
<span class="cm">/**
* Returns value of a user defined property.
*
* @param userProp the lookup user property
* @return property value as a String
*/</span>
<span class="kd">public</span> <span class="n">String</span> <span class="nf">getUserProperty</span><span class="o">(</span><span class="n">String</span> <span class="n">userProp</span><span class="o">);</span>
<span class="cm">/**
* Sets the byte serialization of a fragment meta data
* @param location start, len, and location of the fragment
*/</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">setFragmentMetadata</span><span class="o">(</span><span class="kt">byte</span><span class="o">[]</span> <span class="n">location</span><span class="o">);</span>
<span class="cm">/** Returns the byte serialization of a data fragment */</span>
<span class="kd">public</span> <span class="kt">byte</span><span class="o">[]</span> <span class="nf">getFragmentMetadata</span><span class="o">();</span>
<span class="cm">/**
* Gets any custom user data that may have been passed from the
* fragmenter. Will mostly be used by the accessor or resolver.
*/</span>
<span class="kd">public</span> <span class="kt">byte</span><span class="o">[]</span> <span class="nf">getFragmentUserData</span><span class="o">();</span>
<span class="cm">/**
* Sets any custom user data that needs to be shared across plug-ins.
* Will mostly be set by the fragmenter.
*/</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">setFragmentUserData</span><span class="o">(</span><span class="kt">byte</span><span class="o">[]</span> <span class="n">userData</span><span class="o">);</span>
<span class="cm">/** Returns the number of segments in GP. */</span>
<span class="kd">public</span> <span class="kt">int</span> <span class="nf">getTotalSegments</span><span class="o">();</span>
<span class="cm">/** Returns the current segment ID. */</span>
<span class="kd">public</span> <span class="kt">int</span> <span class="nf">getSegmentId</span><span class="o">();</span>
<span class="cm">/** Returns true if there is a filter string to parse. */</span>
<span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">hasFilter</span><span class="o">();</span>
<span class="cm">/** Returns the filter string, &lt;tt&gt;null&lt;/tt&gt; if #hasFilter is &lt;tt&gt;false&lt;/tt&gt; */</span>
<span class="kd">public</span> <span class="n">String</span> <span class="nf">getFilterString</span><span class="o">();</span>
<span class="cm">/** Returns tuple description. */</span>
<span class="kd">public</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">ColumnDescriptor</span><span class="o">&gt;</span> <span class="nf">getTupleDescription</span><span class="o">();</span>
<span class="cm">/** Returns the number of columns in tuple description. */</span>
<span class="kd">public</span> <span class="kt">int</span> <span class="nf">getColumns</span><span class="o">();</span>
<span class="cm">/** Returns column index from tuple description. */</span>
<span class="kd">public</span> <span class="n">ColumnDescriptor</span> <span class="nf">getColumn</span><span class="o">(</span><span class="kt">int</span> <span class="n">index</span><span class="o">);</span>
<span class="cm">/**
* Returns the column descriptor of the recordkey column. If the recordkey
* column was not specified by the user in the create table statement will
* return null.
*/</span>
<span class="kd">public</span> <span class="n">ColumnDescriptor</span> <span class="nf">getRecordkeyColumn</span><span class="o">();</span>
<span class="cm">/** Returns the data source of the required resource (i.e a file path or a table name). */</span>
<span class="kd">public</span> <span class="n">String</span> <span class="nf">getDataSource</span><span class="o">();</span>
<span class="cm">/** Sets the data source for the required resource */</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">setDataSource</span><span class="o">(</span><span class="n">String</span> <span class="n">dataSource</span><span class="o">);</span>
<span class="cm">/** Returns the ClassName for the java class that was defined as Accessor */</span>
<span class="kd">public</span> <span class="n">String</span> <span class="nf">getAccessor</span><span class="o">();</span>
<span class="cm">/** Returns the ClassName for the java class that was defined as Resolver */</span>
<span class="kd">public</span> <span class="n">String</span> <span class="nf">getResolver</span><span class="o">();</span>
<span class="cm">/**
* Returns the ClassName for the java class that was defined as Fragmenter
* or null if no fragmenter was defined
*/</span>
<span class="kd">public</span> <span class="n">String</span> <span class="nf">getFragmenter</span><span class="o">();</span>
<span class="cm">/**
* Returns the contents of pxf_remote_service_login set in Hawq.
* Should the user set it to an empty string this function will return null.
*
* @return remote login details if set, null otherwise
*/</span>
<span class="kd">public</span> <span class="n">String</span> <span class="nf">getLogin</span><span class="o">();</span>
<span class="cm">/**
* Returns the contents of pxf_remote_service_secret set in Hawq.
* Should the user set it to an empty string this function will return null.
*
* @return remote password if set, null otherwise
*/</span>
<span class="kd">public</span> <span class="n">String</span> <span class="nf">getSecret</span><span class="o">();</span>
<span class="cm">/**
* Returns true if the request is thread safe. Default true. Should be set
* by a user to false if the request contains non thread-safe plug-ins or
* components, such as BZip2 codec.
*/</span>
<span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">isThreadSafe</span><span class="o">();</span>
<span class="cm">/**
* Returns a data fragment index. plan to deprecate it in favor of using
* getFragmentMetadata().
*/</span>
<span class="kd">public</span> <span class="kt">int</span> <span class="nf">getDataFragment</span><span class="o">();</span>
<span class="o">}</span>
</code></pre>
<ul>
<li><p><strong><a href="/docs/userguide/2.3.0.0-incubating/pxf/PXFExternalTableandAPIReference.html#fragmenter">Fragmenter</a></strong></p></li>
<li><p><strong><a href="/docs/userguide/2.3.0.0-incubating/pxf/PXFExternalTableandAPIReference.html#accessor">Accessor</a></strong></p></li>
<li><p><strong><a href="/docs/userguide/2.3.0.0-incubating/pxf/PXFExternalTableandAPIReference.html#resolver">Resolver</a></strong></p></li>
</ul>
<h3 id="fragmenter"><a id="fragmenter"></a>Fragmenter</h3>
<p><strong>Note:</strong> You use the <code>Fragmenter</code> class to read data into HAWQ. You cannot use this class to write data out of HAWQ.</p>
<p>The <code>Fragmenter</code> is responsible for passing datasource metadata back to HAWQ. It also returns a list of data fragments to the <code>Accessor</code> or <code>Resolver</code>. Each data fragment describes some part of the requested data set. It contains the datasource name, such as the file or table name, including the hostname where it is located. For example, if the source is an HDFS file, the <code>Fragmenter</code> returns a list of data fragments containing an HDFS file block. Each fragment includes the location of the block. If the source data is an HBase table, the <code>Fragmenter</code> returns information about table regions, including their locations.</p>
<p>The <code>ANALYZE</code> command now retrieves advanced statistics for PXF readable tables by estimating the number of tuples in a table, creating a sample table from the external table, and running advanced statistics queries on the sample table in the same way statistics are collected for native HAWQ tables.</p>
<p>The configuration parameter <code>pxf_enable_stat_collection</code> controls collection of advanced statistics. If <code>pxf_enable_stat_collection</code> is set to false, no analysis is performed on PXF tables. An additional parameter, <code>pxf_stat_max_fragments</code>, controls the number of fragments sampled to build a sample table. By default <code>pxf_stat_max_fragments</code> is set to 100, which means that even if there are more than 100 fragments, only this number of fragments will be used in <code>ANALYZE</code> to sample the data. Increasing this number will result in better sampling, but can also impact performance.</p>
<p>When a PXF table is analyzed, any of the following conditions might result in a warning message with no statistics gathered for the table:</p>
<ul>
<li><code>pxf_enable_stat_collection</code> is set to off,</li>
<li>an error occurs because the table is not defined correctly,</li>
<li>the PXF service is down, or</li>
<li><code>getFragmentsStats()</code> is not implemented </li>
</ul>
<p>If <code>ANALYZE</code> is running over all tables in the database, the next table will be processed – a failure processing one table does not stop the command.</p>
<p>For a detailed explanation about HAWQ statistical data gathering, refer to the <a href="/docs/userguide/2.3.0.0-incubating/reference/sql/ANALYZE.html"><code>ANALYZE</code></a> SQL command reference.</p>
<p><strong>Note:</strong></p>
<ul>
<li> Depending on external table size, the time required to complete an <code>ANALYZE</code> operation can be lengthy. The boolean parameter <code>pxf_enable_stat_collection</code> enables statistics collection for PXF. The default value is <code>on</code>. Turning this parameter off (disabling PXF statistics collection) can help decrease the time needed for the <code>ANALYZE</code> operation.</li>
<li> You can also use <code>pxf_stat_max_fragments</code> to limit the number of fragments to be sampled by decreasing it from the default (100). However, if the number is too low, the sample might not be uniform and the statistics might be skewed.</li>
<li> You can also implement <code>getFragmentsStats()</code> to return an error. This will cause <code>ANALYZE</code> on a table with this <code>Fragmenter</code> to fail immediately, and default statistics values will be used for that table.</li>
</ul>
<p>The following table lists the <code>Fragmenter</code> plug-in implementations included with the PXF API.</p>
<p><a id="fragmenter__table_cgs_svp_3s"></a></p>
<table>
<caption><span class="tablecap">Table 2. Fragmenter base classes </span></caption>
<colgroup>
<col width="50%" />
<col width="50%" />
</colgroup>
<thead>
<tr class="header">
<th><p>Fragmenter class</p></th>
<th><p>Description</p></th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>org.apache.hawq.pxf.plugins.hdfs.HdfsDataFragmenter</td>
<td>Fragmenter for HDFS, JSON files</td>
</tr>
<tr class="even">
<td>org.apache.hawq.pxf.plugins.hbase.HBaseDataFragmenter</td>
<td>Fragmenter for HBase tables</td>
</tr>
<tr class="odd">
<td>org.apache.hawq.pxf.plugins.hive.HiveDataFragmenter</li>
<td>Fragmenter for Hive tables </td>
</tr>
<tr class="even">
<td>org.apache.hawq.pxf.plugins.hdfs.HiveInputFormatFragmenter</td>
<td>Fragmenter for Hive tables with RC, ORC, or text file formats </td>
</tr>
</tbody>
</table>
<p>A <code>Fragmenter</code> class extends <code>org.apache.hawq.pxf.api.Fragmenter</code>:</p>
<h4 id="org.apache.hawq.pxf.api.fragmenter"><a id="com.pivotal.pxf.api.fragmenter"></a>org.apache.hawq.pxf.api.Fragmenter</h4>
<pre class="highlight java"><code><span class="kn">package</span> <span class="n">org</span><span class="o">.</span><span class="na">apache</span><span class="o">.</span><span class="na">hawq</span><span class="o">.</span><span class="na">pxf</span><span class="o">.</span><span class="na">api</span><span class="o">;</span>
<span class="cm">/**
* Abstract class that defines the splitting of a data resource into fragments
* that can be processed in parallel.
*/</span>
<span class="kd">public</span> <span class="kd">abstract</span> <span class="kd">class</span> <span class="nc">Fragmenter</span> <span class="kd">extends</span> <span class="n">Plugin</span> <span class="o">{</span>
<span class="kd">protected</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">Fragment</span><span class="o">&gt;</span> <span class="n">fragments</span><span class="o">;</span>
<span class="kd">public</span> <span class="nf">Fragmenter</span><span class="o">(</span><span class="n">InputData</span> <span class="n">metaData</span><span class="o">)</span> <span class="o">{</span>
<span class="kd">super</span><span class="o">(</span><span class="n">metaData</span><span class="o">);</span>
<span class="n">fragments</span> <span class="o">=</span> <span class="k">new</span> <span class="n">LinkedList</span><span class="o">&lt;</span><span class="n">Fragment</span><span class="o">&gt;();</span>
<span class="o">}</span>
<span class="cm">/**
* Gets the fragments of a given path (source name and location of each
* fragment). Used to get fragments of data that could be read in parallel
* from the different segments.
*/</span>
<span class="kd">public</span> <span class="kd">abstract</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">Fragment</span><span class="o">&gt;</span> <span class="nf">getFragments</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">Exception</span><span class="o">;</span>
<span class="cm">/**
* Default implementation of statistics for fragments. The default is:
* &lt;ul&gt;
* &lt;li&gt;number of fragments - as gathered by {@link #getFragments()}&lt;/li&gt;
* &lt;li&gt;first fragment size - 64MB&lt;/li&gt;
* &lt;li&gt;total size - number of fragments times first fragment size&lt;/li&gt;
* &lt;/ul&gt;
* Each fragmenter implementation can override this method to better match
* its fragments stats.
*
* @return default statistics
* @throws Exception if statistics cannot be gathered
*/</span>
<span class="kd">public</span> <span class="n">FragmentsStats</span> <span class="nf">getFragmentsStats</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
<span class="n">List</span><span class="o">&lt;</span><span class="n">Fragment</span><span class="o">&gt;</span> <span class="n">fragments</span> <span class="o">=</span> <span class="n">getFragments</span><span class="o">();</span>
<span class="kt">long</span> <span class="n">fragmentsNumber</span> <span class="o">=</span> <span class="n">fragments</span><span class="o">.</span><span class="na">size</span><span class="o">();</span>
<span class="k">return</span> <span class="k">new</span> <span class="nf">FragmentsStats</span><span class="o">(</span><span class="n">fragmentsNumber</span><span class="o">,</span>
<span class="n">FragmentsStats</span><span class="o">.</span><span class="na">DEFAULT_FRAGMENT_SIZE</span><span class="o">,</span> <span class="n">fragmentsNumber</span>
<span class="o">*</span> <span class="n">FragmentsStats</span><span class="o">.</span><span class="na">DEFAULT_FRAGMENT_SIZE</span><span class="o">);</span>
<span class="o">}</span>
<span class="o">}</span>
</code></pre>
<p><code>getFragments()</code> returns a string in JSON format of the retrieved fragment. For example, if the input path is a HDFS directory, the source name for each fragment should include the file name including the path for the fragment.</p>
<h4 id="class-description"><a id="classdescription"></a>Class Description</h4>
<p>The <code>Fragmenter.getFragments()</code> method returns a <code>List&lt;Fragment&gt;</code>:</p>
<pre class="highlight java"><code><span class="kn">package</span> <span class="n">org</span><span class="o">.</span><span class="na">apache</span><span class="o">.</span><span class="na">hawq</span><span class="o">.</span><span class="na">pxf</span><span class="o">.</span><span class="na">api</span><span class="o">;</span>
<span class="cm">/*
* Fragment holds a data fragment' information.
* Fragmenter.getFragments() returns a list of fragments.
*/</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">Fragment</span>
<span class="o">{</span>
<span class="kd">private</span> <span class="n">String</span> <span class="n">sourceName</span><span class="o">;</span> <span class="c1">// File path+name, table name, etc.</span>
<span class="kd">private</span> <span class="kt">int</span> <span class="n">index</span><span class="o">;</span> <span class="c1">// Fragment index (incremented per sourceName)</span>
<span class="kd">private</span> <span class="n">String</span><span class="o">[]</span> <span class="n">replicas</span><span class="o">;</span> <span class="c1">// Fragment replicas (1 or more)</span>
<span class="kd">private</span> <span class="kt">byte</span><span class="o">[]</span> <span class="n">metadata</span><span class="o">;</span> <span class="c1">// Fragment metadata information (starting point + length, region location, etc.)</span>
<span class="kd">private</span> <span class="kt">byte</span><span class="o">[]</span> <span class="n">userData</span><span class="o">;</span> <span class="c1">// ThirdParty data added to a fragment. Ignored if null</span>
<span class="o">...</span>
<span class="o">}</span>
</code></pre>
<h4 id="org.apache.hawq.pxf.api.fragmentsstats"><a id="topic_fzd_tlv_c5"></a>org.apache.hawq.pxf.api.FragmentsStats</h4>
<p>The <code>Fragmenter.getFragmentsStats()</code> method returns a <code>FragmentsStats</code>:</p>
<pre class="highlight java"><code><span class="kn">package</span> <span class="n">org</span><span class="o">.</span><span class="na">apache</span><span class="o">.</span><span class="na">hawq</span><span class="o">.</span><span class="na">pxf</span><span class="o">.</span><span class="na">api</span><span class="o">;</span>
<span class="cm">/**
* FragmentsStats holds statistics for a given path.
*/</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">FragmentsStats</span> <span class="o">{</span>
<span class="c1">// number of fragments</span>
<span class="kd">private</span> <span class="kt">long</span> <span class="n">fragmentsNumber</span><span class="o">;</span>
<span class="c1">// first fragment size</span>
<span class="kd">private</span> <span class="n">SizeAndUnit</span> <span class="n">firstFragmentSize</span><span class="o">;</span>
<span class="c1">// total fragments size</span>
<span class="kd">private</span> <span class="n">SizeAndUnit</span> <span class="n">totalSize</span><span class="o">;</span>
<span class="cm">/**
* Enum to represent unit (Bytes/KB/MB/GB/TB)
*/</span>
<span class="kd">public</span> <span class="kd">enum</span> <span class="n">SizeUnit</span> <span class="o">{</span>
<span class="cm">/**
* Byte
*/</span>
<span class="n">B</span><span class="o">,</span>
<span class="cm">/**
* KB
*/</span>
<span class="n">KB</span><span class="o">,</span>
<span class="cm">/**
* MB
*/</span>
<span class="n">MB</span><span class="o">,</span>
<span class="cm">/**
* GB
*/</span>
<span class="n">GB</span><span class="o">,</span>
<span class="cm">/**
* TB
*/</span>
<span class="n">TB</span><span class="o">;</span>
<span class="o">};</span>
<span class="cm">/**
* Container for size and unit
*/</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">SizeAndUnit</span> <span class="o">{</span>
<span class="kt">long</span> <span class="n">size</span><span class="o">;</span>
<span class="n">SizeUnit</span> <span class="n">unit</span><span class="o">;</span>
<span class="o">...</span>
</code></pre>
<p><code>getFragmentsStats()</code> returns a string in JSON format of statistics for the data source. For example, if the input path is a HDFS directory of 3 files, each one of 1 block, the output will be the number of fragments (3), the size of the first file, and the size of all files in that directory.</p>
<h3 id="accessor"><a id="accessor"></a>Accessor</h3>
<p>The <code>Accessor</code> retrieves specific fragments and passes records back to the Resolver. For example, the HDFS plug-ins create a <code>org.apache.hadoop.mapred.FileInputFormat</code> and a <code>org.apache.hadoop.mapred.RecordReader</code> for an HDFS file and sends this to the <code>Resolver</code>. In the case of HBase or Hive files, the <code>Accessor</code> returns single rows from an HBase or Hive table. PXF includes the following <code>Accessor</code> implementations:</p>
<p><a id="accessor__table_ewm_ttz_4p"></a></p>
<table>
<caption><span class="tablecap">Table 3. Accessor base classes </span></caption>
<colgroup>
<col width="50%" />
<col width="50%" />
</colgroup>
<thead>
<tr class="header">
<th><p>Accessor class</p></th>
<th><p>Description</p></th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>org.apache.hawq.pxf.plugins.hdfs.HdfsAtomicDataAccessor</td>
<td>Base class for accessing datasources which cannot be split. These will be accessed by a single HAWQ segment</td>
</tr>
<tr class="even">
<td>org.apache.hawq.pxf.plugins.hdfs.QuotedLineBreakAccessor</td>
<td>Accessor for TEXT files that have records with embedded linebreaks</td>
</tr>
<tr class="odd">
<td>org.apache.hawq.pxf.plugins.hdfs.HdfsSplittableDataAccessor</td>
<td><p>Base class for accessing HDFS files using <code class="ph codeph">RecordReaders</code></p></td>
</tr>
<tr class="even">
<td>org.apache.hawq.pxf.plugins.hdfs.LineBreakAccessor</td>
<td>Accessor for TEXT files (replaced the deprecated <code class="ph codeph">TextFileAccessor</code>, <code class="ph codeph">LineReaderAccessor</code>)</td>
</tr>
<tr class="odd">
<td>org.apache.hawq.pxf.plugins.hdfs.AvroFileAccessor</td>
<td>Accessor for Avro files</td>
</tr>
<tr class="even">
<td>org.apache.hawq.pxf.plugins.hdfs.SequenceFileAccessor</td>
<td>Accessor for Sequence files</td>
</tr>
<tr class="odd">
<td>org.apache.hawq.pxf.plugins.hbase.HBaseAccessor </td>
<td>Accessor for HBase tables </td>
</tr>
<tr class="even">
<td>org.apache.hawq.pxf.plugins.hive.HiveAccessor</td>
<td>Accessor for Hive tables </td>
</tr>
<tr class="odd">
<td>org.apache.hawq.pxf.plugins.hive.HiveLineBreakAccessor</td>
<td>Accessor for Hive tables stored as text file format</td>
</tr>
<tr class="even">
<td>org.apache.hawq.pxf.plugins.hive.HiveRCFileAccessor</td>
<td>Accessor for Hive tables stored as RC file format</td>
</tr>
</tr>
<tr class="odd">
<td>org.apache.hawq.pxf.plugins.hive.HiveORCAccessor</td>
<td>Accessor for Hive tables stored as ORC format </td>
</tr>
<tr class="even">
<td>org.apache.hawq.pxf.plugins.hive.HiveORCVectorizedAccessor</td>
<td>Accessor for Hive tables stored as ORC format </td>
</tr>
</tr>
<tr class="odd">
<td>org.apache.hawq.pxf.plugins.json.JsonAccessor</td>
<td>Accessor for JSON files</td>
</tr>
</tbody>
</table>
<p>The class must extend the <code>org.apache.hawq.pxf.Plugin</code>  class, and implement one or both of the interfaces:</p>
<ul>
<li> <code>org.apache.hawq.pxf.api.ReadAccessor</code></li>
<li> <code>org.apache.hawq.pxf.api.WriteAccessor</code></li>
</ul>
<pre class="highlight java"><code><span class="kn">package</span> <span class="n">org</span><span class="o">.</span><span class="na">apache</span><span class="o">.</span><span class="na">hawq</span><span class="o">.</span><span class="na">pxf</span><span class="o">.</span><span class="na">api</span><span class="o">;</span>
<span class="cm">/*
* Internal interface that defines the access to data on the source
* data store (e.g, a file on HDFS, a region of an HBase table, etc).
* All classes that implement actual access to such data sources must
* respect this interface
*/</span>
<span class="kd">public</span> <span class="kd">interface</span> <span class="nc">ReadAccessor</span> <span class="o">{</span>
<span class="kt">boolean</span> <span class="nf">openForRead</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">Exception</span><span class="o">;</span>
<span class="n">OneRow</span> <span class="nf">readNextObject</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">Exception</span><span class="o">;</span>
<span class="kt">void</span> <span class="nf">closeForRead</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">Exception</span><span class="o">;</span>
<span class="o">}</span>
</code></pre>
<pre class="highlight java"><code><span class="kn">package</span> <span class="n">org</span><span class="o">.</span><span class="na">apache</span><span class="o">.</span><span class="na">hawq</span><span class="o">.</span><span class="na">pxf</span><span class="o">.</span><span class="na">api</span><span class="o">;</span>
<span class="cm">/*
* An interface for writing data into a data store
* (e.g, a sequence file on HDFS).
* All classes that implement actual access to such data sources must
* respect this interface
*/</span>
<span class="kd">public</span> <span class="kd">interface</span> <span class="nc">WriteAccessor</span> <span class="o">{</span>
<span class="kt">boolean</span> <span class="nf">openForWrite</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">Exception</span><span class="o">;</span>
<span class="n">OneRow</span> <span class="nf">writeNextObject</span><span class="o">(</span><span class="n">OneRow</span> <span class="n">onerow</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">Exception</span><span class="o">;</span>
<span class="kt">void</span> <span class="nf">closeForWrite</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">Exception</span><span class="o">;</span>
<span class="o">}</span>
</code></pre>
<p>The <code>Accessor</code> calls <code>openForRead()</code> to read existing data. After reading the data, it calls <code>closeForRead()</code>. <code>readNextObject()</code> returns one of the following:</p>
<ul>
<li> a single record, encapsulated in a <code>OneRow</code> object</li>
<li> null if it reaches <code>EOF</code></li>
</ul>
<p>The <code>Accessor</code> calls <code>openForWrite()</code> to write data out. After writing the data, it writes a <code>OneRow</code> object with <code>writeNextObject()</code>, and when done calls <code>closeForWrite()</code>. <code>OneRow</code> represents a key-value item.</p>
<h4 id="org.apache.hawq.pxf.api.onerow"><a id="com.pivotal.pxf.api.onerow"></a>org.apache.hawq.pxf.api.OneRow</h4>
<pre class="highlight java"><code><span class="kn">package</span> <span class="n">org</span><span class="o">.</span><span class="na">apache</span><span class="o">.</span><span class="na">hawq</span><span class="o">.</span><span class="na">pxf</span><span class="o">.</span><span class="na">api</span><span class="o">;</span>
<span class="cm">/*
* Represents one row in the external system data store. Supports
* the general case where one row contains both a record and a
* separate key like in the HDFS key/value model for MapReduce
* (Example: HDFS sequence file)
*/</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">OneRow</span> <span class="o">{</span>
<span class="cm">/*
* Default constructor
*/</span>
<span class="kd">public</span> <span class="nf">OneRow</span><span class="o">();</span>
<span class="cm">/*
* Constructor sets key and data
*/</span>
<span class="kd">public</span> <span class="nf">OneRow</span><span class="o">(</span><span class="n">Object</span> <span class="n">inKey</span><span class="o">,</span> <span class="n">Object</span> <span class="n">inData</span><span class="o">);</span>
<span class="cm">/*
* Setter for key
*/</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">setKey</span><span class="o">(</span><span class="n">Object</span> <span class="n">inKey</span><span class="o">);</span>
<span class="cm">/*
* Setter for data
*/</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">setData</span><span class="o">(</span><span class="n">Object</span> <span class="n">inData</span><span class="o">);</span>
<span class="cm">/*
* Accessor for key
*/</span>
<span class="kd">public</span> <span class="n">Object</span> <span class="nf">getKey</span><span class="o">();</span>
<span class="cm">/*
* Accessor for data
*/</span>
<span class="kd">public</span> <span class="n">Object</span> <span class="nf">getData</span><span class="o">();</span>
<span class="cm">/*
* Show content
*/</span>
<span class="kd">public</span> <span class="n">String</span> <span class="nf">toString</span><span class="o">();</span>
<span class="o">}</span>
</code></pre>
<h3 id="resolver"><a id="resolver"></a>Resolver</h3>
<p>The <code>Resolver</code> deserializes records in the <code>OneRow</code> format and serializes them to a list of <code>OneField</code> objects. PXF converts a <code>OneField</code> object to a HAWQ-readable <code>GPDBWritable</code> format. PXF 1.x or higher contains the following implementations:</p>
<p><a id="resolver__table_nbd_d5z_4p"></a></p>
<table>
<caption><span class="tablecap">Table 4. Resolver base classes</span></caption>
<colgroup>
<col width="50%" />
<col width="50%" />
</colgroup>
<thead>
<tr class="header">
<th><p>Resolver class</p></th>
<th><p>Description</p></th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><p>org.apache.hawq.pxf.plugins.hdfs.StringPassResolver</p></td>
<td><p><code class="ph codeph">StringPassResolver</code> replaced the deprecated <code class="ph codeph">TextResolver</code>. It passes whole records (composed of any data types) as strings without parsing them</p></td>
</tr>
<tr class="even">
<td><p>org.apache.hawq.pxf.plugins.hdfs.WritableResolver</p></td>
<td><p>Resolver for custom Hadoop Writable implementations. Custom class can be specified with the schema in `DATA-SCHEMA`. Supports the following types:</p>
<pre class="pre codeblock"><code>DataType.BOOLEAN
DataType.INTEGER
DataType.BIGINT
DataType.REAL
DataType.FLOAT8
DataType.VARCHAR
DataType.BYTEA</code></pre></td>
</tr>
<tr class="odd">
<td><p>org.apache.hawq.pxf.plugins.hdfs.AvroResolver</p></td>
<td><p>Supports the same field objects as <code class="ph codeph">WritableResolver</code>. </p></td>
</tr>
<tr class="even">
<td><p>org.apache.hawq.pxf.plugins.hbase.HBaseResolver</p></td>
<td><p>Supports the same field objects as <code class="ph codeph">WritableResolver</code> and also supports the following:</p>
<pre class="pre codeblock"><code>DataType.SMALLINT
DataType.NUMERIC
DataType.TEXT
DataType.BPCHAR
DataType.TIMESTAMP</code></pre></td>
</tr>
<tr class="odd">
<td><p>org.apache.hawq.pxf.plugins.hive.HiveResolver</p></td>
<td><p>Supports the same field objects as <code class="ph codeph">WritableResolver</code> and also supports the following:</p>
<pre class="pre codeblock"><code>DataType.SMALLINT
DataType.TEXT
DataType.TIMESTAMP</code></pre></td>
</tr>
<tr class="even">
<td><p>org.apache.hawq.pxf.plugins.hive.HiveStringPassResolver</p></td>
<td>Specialized <code class="ph codeph">HiveResolver</code> for a Hive table stored as Text files. Should be used together with <code class="ph codeph">HiveInputFormatFragmenter</code>/<code class="ph codeph">HiveLineBreakAccessor</code>.</td>
</tr>
<tr class="odd">
<td>org.apache.hawq.pxf.plugins.hive.HiveColumnarSerdeResolver</td>
<td>Specialized <code class="ph codeph">HiveResolver</code> for a Hive table stored as RC file. Should be used together with <code class="ph codeph">HiveInputFormatFragmenter</code>/<code class="ph codeph">HiveRCFileAccessor</code>.</td>
</tr>
<tr class="even">
<td>org.apache.hawq.pxf.plugins.hive.HiveORCSerdeResolver</td>
<td>Specialized <code class="ph codeph">HiveResolver</code> for a Hive table stored in ORC format. Should be used together with <code class="ph codeph">HiveInputFormatFragmenter</code>/<code class="ph codeph">HiveORCAccessor</code>.</td>
</tr>
<tr class="odd">
<td>org.apache.hawq.pxf.plugins.hive.HiveORCVectorizedResolver</td>
<td>Specialized <code class="ph codeph">HiveResolver</code> for a Hive table stored in ORC format. Should be used together with <code class="ph codeph">HiveInputFormatFragmenter</code>/<code class="ph codeph">HiveORCVectorizedAccessor</code>.</td>
</tr>
</tbody>
</table>
<p>The class needs to extend the <code>org.apache.hawq.pxf.resolvers.Plugin class</code>, and implement one or both interfaces:</p>
<ul>
<li> <code>org.apache.hawq.pxf.api.ReadResolver</code></li>
<li> <code>org.apache.hawq.pxf.api.WriteResolver</code></li>
</ul>
<pre class="highlight java"><code><span class="kn">package</span> <span class="n">org</span><span class="o">.</span><span class="na">apache</span><span class="o">.</span><span class="na">hawq</span><span class="o">.</span><span class="na">pxf</span><span class="o">.</span><span class="na">api</span><span class="o">;</span>
<span class="cm">/*
* Interface that defines the deserialization of one record brought from
* the data Accessor. Every implementation of a deserialization method
* (e.g, Writable, Avro, ...) must implement this interface.
*/</span>
<span class="kd">public</span> <span class="kd">interface</span> <span class="nc">ReadResolver</span> <span class="o">{</span>
<span class="kd">public</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">OneField</span><span class="o">&gt;</span> <span class="nf">getFields</span><span class="o">(</span><span class="n">OneRow</span> <span class="n">row</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">Exception</span><span class="o">;</span>
<span class="o">}</span>
</code></pre>
<pre class="highlight java"><code><span class="kn">package</span> <span class="n">org</span><span class="o">.</span><span class="na">apache</span><span class="o">.</span><span class="na">hawq</span><span class="o">.</span><span class="na">pxf</span><span class="o">.</span><span class="na">api</span><span class="o">;</span>
<span class="cm">/*
* Interface that defines the serialization of data read from the DB
* into a OneRow object.
* Every implementation of a serialization method
* (e.g, Writable, Avro, ...) must implement this interface.
*/</span>
<span class="kd">public</span> <span class="kd">interface</span> <span class="nc">WriteResolver</span> <span class="o">{</span>
<span class="kd">public</span> <span class="n">OneRow</span> <span class="nf">setFields</span><span class="o">(</span><span class="n">List</span><span class="o">&lt;</span><span class="n">OneField</span><span class="o">&gt;</span> <span class="n">record</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">Exception</span><span class="o">;</span>
<span class="o">}</span>
</code></pre>
<p><strong>Note:</strong></p>
<ul>
<li> <code>getFields()</code> should return a <code>List&lt;OneField&gt;</code>, with each <code>OneField</code> representing a single field.</li>
<li> <code>setFields()</code> should return a single <code>OneRow</code> object, given a <code>List&lt;OneField&gt;</code>.</li>
</ul>
<h4 id="org.apache.hawq.pxf.api.onefield"><a id="com.pivotal.pxf.api.onefield"></a>org.apache.hawq.pxf.api.OneField</h4>
<pre class="highlight java"><code><span class="kn">package</span> <span class="n">org</span><span class="o">.</span><span class="na">apache</span><span class="o">.</span><span class="na">hawq</span><span class="o">.</span><span class="na">pxf</span><span class="o">.</span><span class="na">api</span><span class="o">;</span>
<span class="cm">/*
* Defines one field on a deserialized record.
* 'type' is in OID values recognized by GPDBWritable
* 'val' is the actual field value
*/</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">OneField</span> <span class="o">{</span>
<span class="kd">public</span> <span class="nf">OneField</span><span class="o">()</span> <span class="o">{}</span>
<span class="kd">public</span> <span class="nf">OneField</span><span class="o">(</span><span class="kt">int</span> <span class="n">type</span><span class="o">,</span> <span class="n">Object</span> <span class="n">val</span><span class="o">)</span> <span class="o">{</span>
<span class="k">this</span><span class="o">.</span><span class="na">type</span> <span class="o">=</span> <span class="n">type</span><span class="o">;</span>
<span class="k">this</span><span class="o">.</span><span class="na">val</span> <span class="o">=</span> <span class="n">val</span><span class="o">;</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="kt">int</span> <span class="n">type</span><span class="o">;</span>
<span class="kd">public</span> <span class="n">Object</span> <span class="n">val</span><span class="o">;</span>
<span class="o">}</span>
</code></pre>
<p>The value of <code>type</code> should follow the <code>org.apache.hawq.pxf.api.io.DataType</code> <code>enums</code>. <code>val</code> is the appropriate Java class. Supported types are:</p>
<p><a id="com.pivotal.pxf.api.onefield__table_f4x_35z_4p"></a></p>
<table>
<caption><span class="tablecap">Table 5. Resolver supported types</span></caption>
<colgroup>
<col width="50%" />
<col width="50%" />
</colgroup>
<thead>
<tr class="header">
<th><p>DataType recognized OID</p></th>
<th><p>Field value</p></th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><p><code class="ph codeph">DataType.SMALLINT</code></p></td>
<td><p><code class="ph codeph">Short</code></p></td>
</tr>
<tr class="even">
<td><p><code class="ph codeph">DataType.INTEGER</code></p></td>
<td><p><code class="ph codeph">Integer</code></p></td>
</tr>
<tr class="odd">
<td><p><code class="ph codeph">DataType.BIGINT</code></p></td>
<td><p><code class="ph codeph">Long</code></p></td>
</tr>
<tr class="even">
<td><p><code class="ph codeph">DataType.REAL</code></p></td>
<td><p><code class="ph codeph">Float</code></p></td>
</tr>
<tr class="odd">
<td><p><code class="ph codeph">DataType.FLOAT8</code></p></td>
<td><p><code class="ph codeph">Double</code></p></td>
</tr>
<tr class="even">
<td><p><code class="ph codeph">DataType.NUMERIC</code></p></td>
<td><p><code class="ph codeph">String (&quot;651687465135468432168421&quot;)</code></p></td>
</tr>
<tr class="odd">
<td><p><code class="ph codeph">DataType.BOOLEAN</code></p></td>
<td><p><code class="ph codeph">Boolean</code></p></td>
</tr>
<tr class="even">
<td><p><code class="ph codeph">DataType.VARCHAR</code></p></td>
<td><p><code class="ph codeph">String</code></p></td>
</tr>
<tr class="odd">
<td><p><code class="ph codeph">DataType.BPCHAR</code></p></td>
<td><p><code class="ph codeph">String</code></p></td>
</tr>
<tr class="even">
<td><p><code class="ph codeph">DataType.TEXT</code></p></td>
<td><p><code class="ph codeph">String</code></p></td>
</tr>
<tr class="odd">
<td><p><code class="ph codeph">DataType.BYTEA</code></p></td>
<td><p><code class="ph codeph">byte []</code></p></td>
</tr>
<tr class="even">
<td><p><code class="ph codeph">DataType.TIMESTAMP</code></p></td>
<td><p><code class="ph codeph">Timestamp</code></p></td>
</tr>
<tr class="odd">
<td><p><code class="ph codeph">DataType.Date</code></p></td>
<td><p><code class="ph codeph">Date</code></p></td>
</tr>
</tbody>
</table>
<h2 id="about-custom-profiles"><a id="aboutcustomprofiles"></a>About Custom Profiles</h2>
<p>Administrators can add new profiles or edit the built-in profiles in <code>/etc/pxf/conf/pxf-profiles.xml</code>. See <a href="/docs/userguide/2.3.0.0-incubating/pxf/ReadWritePXF.html#readingandwritingdatawithpxf">Using Profiles to Read and Write Data</a> for information on how to add custom profiles.</p>
<h2 id="about-query-filter-push-down"><a id="aboutqueryfilterpush-down"></a>About Query Filter Push-Down</h2>
<p>If a query includes a number of <code>WHERE</code> clause filters,  HAWQ may push all or some queries to PXF. If pushed to PXF, the <code>Accessor</code> can use the filtering information when accessing the data source to fetch tuples. These filters only return records that pass filter evaluation conditions. This reduces data processing and reduces network traffic from the SQL engine.</p>
<p>This topic includes the following information:</p>
<ul>
<li> Filter Availability and Ordering </li>
<li> Creating a Filter Builder class</li>
<li> Filter Operations</li>
<li> Sample Implementation</li>
<li> Using Filters</li>
</ul>
<h3 id="filter-availability-and-ordering"><a id="filteravailabilityandordering"></a>Filter Availability and Ordering</h3>
<p>PXF allows push-down filtering if the following rules are met:</p>
<ul>
<li> Uses only single expressions or a group of AND&#39;ed expressions - no OR&#39;ed expressions.</li>
<li> Uses only expressions of supported data types and operators.</li>
</ul>
<p><code>FilterParser</code> scans the pushed down filter list and uses the user&rsquo;s <code>build()</code> implementation to build the filter.</p>
<ul>
<li> For simple expressions (e.g, a &gt;= 5), <code>FilterParser</code> places column objects on the left of the expression and constants on the right.</li>
<li> For compound expressions (e.g &lt;expression&gt; AND &lt;expression&gt;) it handles three cases in the <code>build()</code> function:
<ol>
<li> Simple Expression: &lt;Column Index&gt; &lt;Operation&gt; &lt;Constant&gt;</li>
<li> Compound Expression: &lt;Filter Object&gt; AND &lt;Filter Object&gt;</li>
<li> Compound Expression: &lt;List of Filter Objects&gt; AND &lt;Filter Object&gt;</li>
</ol></li>
</ul>
<h3 id="creating-a-filter-builder-class"><a id="creatingafilterbuilderclass"></a>Creating a Filter Builder Class</h3>
<p>To check if a filter queried PXF, call the <code>InputData.hasFilter()</code> function:</p>
<pre class="highlight java"><code><span class="cm">/*
 * Returns true if there is a filter string to parse
 */</span>
<span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">hasFilter</span><span class="o">()</span>
<span class="o">{</span>
<span class="k">return</span> <span class="n">filterStringValid</span><span class="o">;</span>
<span class="o">}</span>
</code></pre>
<p>If <code>hasFilter()</code> returns <code>false</code>, there is no filter information. If it returns <code>true</code>, PXF parses the serialized filter string into a meaningful filter object to use later. To do so, create a filter builder class that implements the <code>FilterParser.FilterBuilder</code> interface:</p>
<pre class="highlight java"><code><span class="kn">package</span> <span class="n">org</span><span class="o">.</span><span class="na">apache</span><span class="o">.</span><span class="na">hawq</span><span class="o">.</span><span class="na">pxf</span><span class="o">.</span><span class="na">api</span><span class="o">;</span>
<span class="cm">/*
 * Interface a user of FilterParser should implement
 * This is used to let the user build filter expressions in the manner she 
 * sees fit
 *
 * When an operator is parsed, this function is called to let the user decide
 * what to do with its operands.
 */</span>
<span class="kd">interface</span> <span class="nc">FilterBuilder</span> <span class="o">{</span>
<span class="kd">public</span> <span class="n">Object</span> <span class="nf">build</span><span class="o">(</span><span class="n">Operation</span> <span class="n">operation</span><span class="o">,</span> <span class="n">Object</span> <span class="n">left</span><span class="o">,</span> <span class="n">Object</span> <span class="n">right</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">Exception</span><span class="o">;</span>
<span class="o">}</span>
</code></pre>
<p>While PXF parses the serialized filter string from the incoming HAWQ query, it calls the <code>build()</code> function. PXF calls this function for each condition or filter pushed down to PXF. Implementing this function returns some Filter object or representation that the <code>Fragmenter</code>, <code>Accessor</code>, or <code>Resolver</code> uses in runtime to filter out records. The <code>build()</code> function accepts an Operation as input, and left and right operands.</p>
<h3 id="filter-operations"><a id="filteroperations"></a>Filter Operations</h3>
<pre class="highlight java"><code><span class="cm">/*
 * Operations supported by the parser
 */</span>
<span class="kd">public</span> <span class="kd">enum</span> <span class="n">Operation</span>
<span class="o">{</span>
<span class="n">HDOP_LT</span><span class="o">,</span> <span class="c1">//less than</span>
<span class="n">HDOP_GT</span><span class="o">,</span> <span class="c1">//greater than</span>
<span class="n">HDOP_LE</span><span class="o">,</span> <span class="c1">//less than or equal</span>
<span class="n">HDOP_GE</span><span class="o">,</span> <span class="c1">//greater than or equal</span>
<span class="n">HDOP_EQ</span><span class="o">,</span> <span class="c1">//equal</span>
<span class="n">HDOP_NE</span><span class="o">,</span> <span class="c1">//not equal</span>
<span class="n">HDOP_LIKE</span><span class="o">,</span>
<span class="n">HDOP_IS_NULL</span><span class="o">,</span>
<span class="n">HDOP_IS_NOT_NULL</span><span class="o">,</span>
<span class="n">HDOP_IN</span>
<span class="o">};</span>
<span class="cm">/**
* Logical operators
*/</span>
<span class="kd">public</span> <span class="kd">enum</span> <span class="n">LogicalOperation</span> <span class="o">{</span>
<span class="n">HDOP_AND</span><span class="o">,</span>
<span class="n">HDOP_OR</span><span class="o">,</span>
<span class="n">HDOP_NOT</span>
<span class="o">}</span>
</code></pre>
<h4 id="filter-operands"><a id="filteroperands"></a>Filter Operands</h4>
<p>There are three types of operands:</p>
<ul>
<li> Column Index</li>
<li> Constant</li>
<li> Filter Object</li>
</ul>
<h4 id="column-index"><a id="columnindex"></a>Column Index</h4>
<pre class="highlight java"><code><span class="cm">/*
 * Represents a column index
*/</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">ColumnIndex</span>
<span class="o">{</span>
<span class="kd">public</span> <span class="nf">ColumnIndex</span><span class="o">(</span><span class="kt">int</span> <span class="n">idx</span><span class="o">);</span>
<span class="kd">public</span> <span class="kt">int</span> <span class="nf">index</span><span class="o">();</span>
<span class="o">}</span>
</code></pre>
<h4 id="constant"><a id="constant"></a>Constant</h4>
<pre class="highlight java"><code><span class="cm">/*
* The class represents a constant object (String, Long, ...)
 */</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">Constant</span>
<span class="o">{</span>
<span class="kd">public</span> <span class="nf">Constant</span><span class="o">(</span><span class="n">Object</span> <span class="n">obj</span><span class="o">);</span>
<span class="kd">public</span> <span class="n">Object</span> <span class="nf">constant</span><span class="o">();</span>
<span class="o">}</span>
</code></pre>
<h4 id="filter-object"><a id="filterobject"></a>Filter Object</h4>
<p>Filter Objects can be internal - such as those you define - or external, those that the remote system uses. For example, for HBase you define the HBase <code>Filter</code> class (<code>org.apache.hadoop.hbase.filter.Filter</code>), while for Hive you use an internal default representation created by the PXF framework, called <code>BasicFilter</code>. You can choose the filter object to use, including writing a new one. <code>BasicFilter</code> is the most common:</p>
<pre class="highlight java"><code><span class="cm">/*
 * Basic filter provided for cases where the target storage system does not provide its own filter
 * For example: Hbase storage provides its own filter but for a Writable based record in a SequenceFile
 * there is no filter provided and so we need to have a default
 */</span>
<span class="kd">static</span> <span class="kd">public</span> <span class="kd">class</span> <span class="nc">BasicFilter</span>
<span class="o">{</span>
<span class="cm">/*
  * C'tor
  */</span>
<span class="kd">public</span> <span class="nf">BasicFilter</span><span class="o">(</span><span class="n">Operation</span> <span class="n">inOper</span><span class="o">,</span> <span class="n">ColumnIndex</span> <span class="n">inColumn</span><span class="o">,</span> <span class="n">Constant</span> <span class="n">inConstant</span><span class="o">);</span>
<span class="cm">/*
   * Returns oper field
   */</span>
<span class="kd">public</span> <span class="n">Operation</span> <span class="nf">getOperation</span><span class="o">();</span>
<span class="cm">/*
   * Returns column field
   */</span>
<span class="kd">public</span> <span class="n">ColumnIndex</span> <span class="nf">getColumn</span><span class="o">();</span>
<span class="cm">/*
   * Returns constant field
   */</span>
<span class="kd">public</span> <span class="n">Constant</span> <span class="nf">getConstant</span><span class="o">();</span>
<span class="o">}</span>
</code></pre>
<h3 id="sample-implementation"><a id="sampleimplementation"></a>Sample Implementation</h3>
<p>Let&rsquo;s look at the following sample implementation of the filter builder class and its <code>build()</code> function that handles all 3 cases. Let&rsquo;s assume that <code>BasicFilter</code> was used to hold our filter operations.</p>
<pre class="highlight java"><code><span class="kn">import</span> <span class="nn">java.util.LinkedList</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.util.List</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">org.apache.hawq.pxf.api.FilterParser</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">org.apache.hawq.pxf.api.utilities.InputData</span><span class="o">;</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">MyDemoFilterBuilder</span> <span class="kd">implements</span> <span class="n">FilterParser</span><span class="o">.</span><span class="na">FilterBuilder</span>
<span class="o">{</span>
<span class="kd">private</span> <span class="n">InputData</span> <span class="n">inputData</span><span class="o">;</span>
<span class="kd">public</span> <span class="nf">MyDemoFilterBuilder</span><span class="o">(</span><span class="n">InputData</span> <span class="n">input</span><span class="o">)</span>
<span class="o">{</span>
<span class="n">inputData</span> <span class="o">=</span> <span class="n">input</span><span class="o">;</span>
<span class="o">}</span>
<span class="cm">/*
* Translates a filterString into a FilterParser.BasicFilter or a list of such filters
*/</span>
<span class="kd">public</span> <span class="n">Object</span> <span class="nf">getFilterObject</span><span class="o">(</span><span class="n">String</span> <span class="n">filterString</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">Exception</span>
<span class="o">{</span>
<span class="n">FilterParser</span> <span class="n">parser</span> <span class="o">=</span> <span class="k">new</span> <span class="n">FilterParser</span><span class="o">(</span><span class="k">this</span><span class="o">);</span>
<span class="n">Object</span> <span class="n">result</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="na">parse</span><span class="o">(</span><span class="n">filterString</span><span class="o">);</span>
<span class="k">if</span> <span class="o">(!(</span><span class="n">result</span> <span class="k">instanceof</span> <span class="n">FilterParser</span><span class="o">.</span><span class="na">BasicFilter</span><span class="o">)</span> <span class="o">&amp;&amp;</span> <span class="o">!(</span><span class="n">result</span> <span class="k">instanceof</span> <span class="n">List</span><span class="o">))</span>
<span class="k">throw</span> <span class="k">new</span> <span class="nf">Exception</span><span class="o">(</span><span class="s">"String "</span> <span class="o">+</span> <span class="n">filterString</span> <span class="o">+</span> <span class="s">" resolved to no filter"</span><span class="o">);</span>
<span class="k">return</span> <span class="n">result</span><span class="o">;</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="n">Object</span> <span class="nf">build</span><span class="o">(</span><span class="n">FilterParser</span><span class="o">.</span><span class="na">Operation</span> <span class="n">opId</span><span class="o">,</span>
<span class="n">Object</span> <span class="n">leftOperand</span><span class="o">,</span>
<span class="n">Object</span> <span class="n">rightOperand</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">Exception</span>
<span class="o">{</span>
<span class="k">if</span> <span class="o">(</span><span class="n">leftOperand</span> <span class="k">instanceof</span> <span class="n">FilterParser</span><span class="o">.</span><span class="na">BasicFilter</span><span class="o">)</span>
<span class="o">{</span>
<span class="c1">//sanity check</span>
<span class="k">if</span> <span class="o">(</span><span class="n">opId</span> <span class="o">!=</span> <span class="n">FilterParser</span><span class="o">.</span><span class="na">Operation</span><span class="o">.</span><span class="na">HDOP_AND</span> <span class="o">||</span> <span class="o">!(</span><span class="n">rightOperand</span> <span class="k">instanceof</span> <span class="n">FilterParser</span><span class="o">.</span><span class="na">BasicFilter</span><span class="o">))</span>
<span class="k">throw</span> <span class="k">new</span> <span class="nf">Exception</span><span class="o">(</span><span class="s">"Only AND is allowed between compound expressions"</span><span class="o">);</span>
<span class="c1">//case 3</span>
<span class="k">if</span> <span class="o">(</span><span class="n">leftOperand</span> <span class="k">instanceof</span> <span class="n">List</span><span class="o">)</span>
<span class="k">return</span> <span class="nf">handleCompoundOperations</span><span class="o">((</span><span class="n">List</span><span class="o">&lt;</span><span class="n">FilterParser</span><span class="o">.</span><span class="na">BasicFilter</span><span class="o">&gt;)</span><span class="n">leftOperand</span><span class="o">,</span> <span class="o">(</span><span class="n">FilterParser</span><span class="o">.</span><span class="na">BasicFilter</span><span class="o">)</span><span class="n">rightOperand</span><span class="o">);</span>
<span class="c1">//case 2</span>
<span class="k">else</span>
<span class="k">return</span> <span class="nf">handleCompoundOperations</span><span class="o">((</span><span class="n">FilterParser</span><span class="o">.</span><span class="na">BasicFilter</span><span class="o">)</span><span class="n">leftOperand</span><span class="o">,</span> <span class="o">(</span><span class="n">FilterParser</span><span class="o">.</span><span class="na">BasicFilter</span><span class="o">)</span><span class="n">rightOperand</span><span class="o">);</span>
<span class="o">}</span>
<span class="c1">//sanity check</span>
<span class="k">if</span> <span class="o">(!(</span><span class="n">rightOperand</span> <span class="k">instanceof</span> <span class="n">FilterParser</span><span class="o">.</span><span class="na">Constant</span><span class="o">))</span>
<span class="k">throw</span> <span class="k">new</span> <span class="nf">Exception</span><span class="o">(</span><span class="s">"expressions of column-op-column are not supported"</span><span class="o">);</span>
<span class="c1">//case 1 (assume column is on the left)</span>
<span class="k">return</span> <span class="nf">handleSimpleOperations</span><span class="o">(</span><span class="n">opId</span><span class="o">,</span> <span class="o">(</span><span class="n">FilterParser</span><span class="o">.</span><span class="na">ColumnIndex</span><span class="o">)</span><span class="n">leftOperand</span><span class="o">,</span> <span class="o">(</span><span class="n">FilterParser</span><span class="o">.</span><span class="na">Constant</span><span class="o">)</span><span class="n">rightOperand</span><span class="o">);</span>
<span class="o">}</span>
<span class="kd">private</span> <span class="n">FilterParser</span><span class="o">.</span><span class="na">BasicFilter</span> <span class="nf">handleSimpleOperations</span><span class="o">(</span><span class="n">FilterParser</span><span class="o">.</span><span class="na">Operation</span> <span class="n">opId</span><span class="o">,</span>
<span class="n">FilterParser</span><span class="o">.</span><span class="na">ColumnIndex</span> <span class="n">column</span><span class="o">,</span>
<span class="n">FilterParser</span><span class="o">.</span><span class="na">Constant</span> <span class="n">constant</span><span class="o">)</span>
<span class="o">{</span>
<span class="k">return</span> <span class="k">new</span> <span class="n">FilterParser</span><span class="o">.</span><span class="na">BasicFilter</span><span class="o">(</span><span class="n">opId</span><span class="o">,</span> <span class="n">column</span><span class="o">,</span> <span class="n">constant</span><span class="o">);</span>
<span class="o">}</span>
<span class="kd">private</span> <span class="n">List</span> <span class="nf">handleCompoundOperations</span><span class="o">(</span><span class="n">List</span><span class="o">&lt;</span><span class="n">FilterParser</span><span class="o">.</span><span class="na">BasicFilter</span><span class="o">&gt;</span> <span class="n">left</span><span class="o">,</span>
<span class="n">FilterParser</span><span class="o">.</span><span class="na">BasicFilter</span> <span class="n">right</span><span class="o">)</span>
<span class="o">{</span>
<span class="n">left</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">right</span><span class="o">);</span>
<span class="k">return</span> <span class="n">left</span><span class="o">;</span>
<span class="o">}</span>
<span class="kd">private</span> <span class="n">List</span> <span class="nf">handleCompoundOperations</span><span class="o">(</span><span class="n">FilterParser</span><span class="o">.</span><span class="na">BasicFilter</span> <span class="n">left</span><span class="o">,</span>
<span class="n">FilterParser</span><span class="o">.</span><span class="na">BasicFilter</span> <span class="n">right</span><span class="o">)</span>
<span class="o">{</span>
<span class="n">List</span><span class="o">&lt;</span><span class="n">FilterParser</span><span class="o">.</span><span class="na">BasicFilter</span><span class="o">&gt;</span> <span class="n">result</span> <span class="o">=</span> <span class="k">new</span> <span class="n">LinkedList</span><span class="o">&lt;</span><span class="n">FilterParser</span><span class="o">.</span><span class="na">BasicFilter</span><span class="o">&gt;();</span>
<span class="n">result</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">left</span><span class="o">);</span>
<span class="n">result</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">right</span><span class="o">);</span>
<span class="k">return</span> <span class="n">result</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">}</span>
</code></pre>
<p>Here is an example of creating a filter-builder class to implement the Filter interface, implement the <code>build()</code> function, and generate the Filter object. To do this, use either the <code>Accessor</code>, <code>Resolver</code>, or both to call the <code>getFilterObject()</code> function:</p>
<pre class="highlight java"><code><span class="k">if</span> <span class="o">(</span><span class="n">inputData</span><span class="o">.</span><span class="na">hasFilter</span><span class="o">())</span>
<span class="o">{</span>
<span class="n">String</span> <span class="n">filterStr</span> <span class="o">=</span> <span class="n">inputData</span><span class="o">.</span><span class="na">filterString</span><span class="o">();</span>
<span class="n">MyDemoFilterBuilder</span> <span class="n">demobuilder</span> <span class="o">=</span> <span class="k">new</span> <span class="n">MyDemoFilterBuilder</span><span class="o">(</span><span class="n">inputData</span><span class="o">);</span>
<span class="n">Object</span> <span class="n">filter</span> <span class="o">=</span> <span class="n">demobuilder</span><span class="o">.</span><span class="na">getFilterObject</span><span class="o">(</span><span class="n">filterStr</span><span class="o">);</span>
<span class="o">...</span>
<span class="o">}</span>
</code></pre>
<h3 id="using-filters"><a id="usingfilters"></a>Using Filters</h3>
<p>Once you have built the Filter object(s), you can use them to read data and filter out records that do not meet the filter conditions:</p>
<ol>
<li> Check whether you have a single or multiple filters.</li>
<li> Evaluate each filter and iterate over each filter in the list. Disqualify the record if filter conditions fail.</li>
</ol>
<pre class="highlight java"><code><span class="k">if</span> <span class="o">(</span><span class="n">filter</span> <span class="k">instanceof</span> <span class="n">List</span><span class="o">)</span>
<span class="o">{</span>
<span class="k">for</span> <span class="o">(</span><span class="n">Object</span> <span class="n">f</span> <span class="o">:</span> <span class="o">(</span><span class="n">List</span><span class="o">)</span><span class="n">filter</span><span class="o">)</span>
<span class="o">&lt;</span><span class="n">evaluate</span> <span class="n">f</span><span class="o">&gt;;</span> <span class="c1">//may want to break if evaluation results in negative answer for any filter.</span>
<span class="o">}</span>
<span class="k">else</span>
<span class="o">{</span>
<span class="o">&lt;</span><span class="n">evaluate</span> <span class="n">filter</span><span class="o">&gt;;</span>
<span class="o">}</span>
</code></pre>
<p>Example showing evaluation of a single filter:</p>
<pre class="highlight java"><code><span class="c1">//Get our BasicFilter Object</span>
<span class="n">FilterParser</span><span class="o">.</span><span class="na">BasicFilter</span> <span class="n">bFilter</span> <span class="o">=</span> <span class="o">(</span><span class="n">FilterParser</span><span class="o">.</span><span class="na">BasicFilter</span><span class="o">)</span><span class="n">filter</span><span class="o">;</span>
<span class="c1">//Get operation and operator values</span>
<span class="n">FilterParser</span><span class="o">.</span><span class="na">Operation</span> <span class="n">op</span> <span class="o">=</span> <span class="n">bFilter</span><span class="o">.</span><span class="na">getOperation</span><span class="o">();</span>
<span class="kt">int</span> <span class="n">colIdx</span> <span class="o">=</span> <span class="n">bFilter</span><span class="o">.</span><span class="na">getColumn</span><span class="o">().</span><span class="na">index</span><span class="o">();</span>
<span class="n">String</span> <span class="n">val</span> <span class="o">=</span> <span class="n">bFilter</span><span class="o">.</span><span class="na">getConstant</span><span class="o">().</span><span class="na">constant</span><span class="o">().</span><span class="na">toString</span><span class="o">();</span>
<span class="c1">//Get more info about the column if desired</span>
<span class="n">ColumnDescriptor</span> <span class="n">col</span> <span class="o">=</span> <span class="n">input</span><span class="o">.</span><span class="na">getColumn</span><span class="o">(</span><span class="n">colIdx</span><span class="o">);</span>
<span class="n">String</span> <span class="n">colName</span> <span class="o">=</span> <span class="n">filterColumn</span><span class="o">.</span><span class="na">columnName</span><span class="o">();</span>
<span class="c1">//Now evaluate it against the actual column value in the record...</span>
</code></pre>
<h2 id="examples"><a id="reference"></a>Examples</h2>
<p>This section contains the following information:</p>
<ul>
<li> <strong><a href="#externaltableexamples">External Table Examples</a></strong></li>
<li> <strong><a href="#pluginexamples">Plug-in Examples</a></strong></li>
</ul>
<h3 id="external-table-examples"><a id="externaltableexamples"></a>External Table Examples</h3>
<h4 id="example-1"><a id="example1"></a>Example 1</h4>
<p>Shows an external table that can analyze all <code>Sequencefiles</code> that are populated <code>Writable</code> serialized records and exist inside the hdfs directory <code>sales/2012/01</code>. <code>SaleItem.class</code> is a Java class that implements the <code>Writable</code> interface and describes a Java record that includes three class members.</p>
<p><strong>Note:</strong> In this example, the class member names do not necessarily match the database attribute names, but the types match. <code>SaleItem.class</code> must exist in the classpath of every DataNode and NameNode.</p>
<pre class="highlight sql"><code><span class="k">CREATE</span> <span class="k">EXTERNAL</span> <span class="k">TABLE</span> <span class="n">jan_2012_sales</span> <span class="p">(</span><span class="n">id</span> <span class="n">int</span><span class="p">,</span> <span class="n">total</span> <span class="n">int</span><span class="p">,</span> <span class="n">comments</span> <span class="n">varchar</span><span class="p">)</span>
<span class="k">LOCATION</span> <span class="p">(</span><span class="s1">'pxf://10.76.72.26:51200/sales/2012/01/*.seq'</span>
<span class="s1">'?FRAGMENTER=org.apache.hawq.pxf.plugins.hdfs.HdfsDataFragmenter'</span>
<span class="s1">'&amp;ACCESSOR=org.apache.hawq.pxf.plugins.hdfs.SequenceFileAccessor'</span>
<span class="s1">'&amp;RESOLVER=org.apache.hawq.pxf.plugins.hdfs.WritableResolver'</span>
<span class="s1">'&amp;DATA-SCHEMA=SaleItem'</span><span class="p">)</span>
<span class="n">FORMAT</span> <span class="s1">'custom'</span> <span class="p">(</span><span class="n">formatter</span><span class="o">=</span><span class="s1">'pxfwritable_import'</span><span class="p">);</span>
</code></pre>
<h4 id="example-2"><a id="example2"></a>Example 2</h4>
<p>Example 2 shows an external table that can analyze an HBase table called <code>sales</code>. It has 10 column families <code>(cf1 – cf10)</code> and many qualifier names in each family. This example focuses on the <code>rowkey</code>, the qualifier <code>saleid</code> inside column family <code>cf1</code>, and the qualifier <code>comments</code> inside column family <code>cf8</code> and uses direct mapping:</p>
<pre class="highlight sql"><code><span class="k">CREATE</span> <span class="k">EXTERNAL</span> <span class="k">TABLE</span> <span class="n">hbase_sales</span>
<span class="p">(</span><span class="n">hbaserowkey</span> <span class="n">text</span><span class="p">,</span> <span class="nv">"cf1:saleid"</span> <span class="n">int</span><span class="p">,</span> <span class="nv">"cf8:comments"</span> <span class="n">varchar</span><span class="p">)</span>
<span class="k">LOCATION</span> <span class="p">(</span><span class="s1">'pxf://10.76.72.26:51200/sales?PROFILE=HBase'</span><span class="p">)</span>
<span class="n">FORMAT</span> <span class="s1">'custom'</span> <span class="p">(</span><span class="n">formatter</span><span class="o">=</span><span class="s1">'pxfwritable_import'</span><span class="p">);</span>
</code></pre>
<h4 id="example-3"><a id="example3"></a>Example 3</h4>
<p>This example uses indirect mapping. Note how the attribute name changes and how they correspond to the HBase lookup table. Executing <code>SELECT FROM my_hbase_sales</code>, the attribute names automatically convert to their HBase correspondents.</p>
<pre class="highlight sql"><code><span class="k">CREATE</span> <span class="k">EXTERNAL</span> <span class="k">TABLE</span> <span class="n">my_hbase_sales</span> <span class="p">(</span><span class="n">hbaserowkey</span> <span class="n">text</span><span class="p">,</span> <span class="n">id</span> <span class="n">int</span><span class="p">,</span> <span class="n">cmts</span> <span class="n">varchar</span><span class="p">)</span>
<span class="k">LOCATION</span>
<span class="p">(</span><span class="s1">'pxf://10.76.72.26:51200/sales?PROFILE=HBase'</span><span class="p">)</span>
<span class="n">FORMAT</span> <span class="s1">'custom'</span> <span class="p">(</span><span class="n">formatter</span><span class="o">=</span><span class="s1">'pxfwritable_import'</span><span class="p">);</span>
</code></pre>
<h4 id="example-4"><a id="example4"></a>Example 4</h4>
<p>Shows an example for a writable table of compressed data. </p>
<pre class="highlight sql"><code><span class="k">CREATE</span> <span class="n">WRITABLE</span> <span class="k">EXTERNAL</span> <span class="k">TABLE</span> <span class="n">sales_aggregated_2012</span>
<span class="p">(</span><span class="n">id</span> <span class="n">int</span><span class="p">,</span> <span class="n">total</span> <span class="n">int</span><span class="p">,</span> <span class="n">comments</span> <span class="n">varchar</span><span class="p">)</span>
<span class="k">LOCATION</span> <span class="p">(</span><span class="s1">'pxf://10.76.72.26:51200/sales/2012/aggregated'</span>
<span class="s1">'?PROFILE=HdfsTextSimple'</span>
<span class="s1">'&amp;COMPRESSION_CODEC=org.apache.hadoop.io.compress.BZip2Codec'</span><span class="p">)</span>
<span class="n">FORMAT</span> <span class="s1">'TEXT'</span><span class="p">;</span>
</code></pre>
<h4 id="example-5"><a id="example5"></a>Example 5</h4>
<p>Shows an example for a writable table into a sequence file, using a schema file. For writable tables, the formatter is <code>pxfwritable_export</code>.</p>
<pre class="highlight sql"><code><span class="k">CREATE</span> <span class="n">WRITABLE</span> <span class="k">EXTERNAL</span> <span class="k">TABLE</span> <span class="n">sales_max_2012</span>
<span class="p">(</span><span class="n">id</span> <span class="n">int</span><span class="p">,</span> <span class="n">total</span> <span class="n">int</span><span class="p">,</span> <span class="n">comments</span> <span class="n">varchar</span><span class="p">)</span>
<span class="k">LOCATION</span> <span class="p">(</span><span class="s1">'pxf://10.76.72.26:51200/sales/2012/max'</span>
<span class="s1">'?FRAGMENTER=org.apache.hawq.pxf.plugins.hdfs.HdfsDataFragmenter'</span>
<span class="s1">'&amp;ACCESSOR=org.apache.hawq.pxf.plugins.hdfs.SequenceFileAccessor'</span>
<span class="s1">'&amp;RESOLVER=org.apache.hawq.pxf.plugins.hdfs.WritableResolver'</span>
<span class="s1">'&amp;DATA-SCHEMA=SaleItem'</span><span class="p">)</span>
<span class="n">FORMAT</span> <span class="s1">'custom'</span> <span class="p">(</span><span class="n">formatter</span><span class="o">=</span><span class="s1">'pxfwritable_export'</span><span class="p">);</span>
</code></pre>
<h3 id="plug-in-examples"><a id="pluginexamples"></a>Plug-in Examples</h3>
<p>This section contains sample dummy implementations of all three plug-ins. It also includes a usage example.</p>
<h4 id="dummy-fragmenter"><a id="dummyfragmenter"></a>Dummy Fragmenter</h4>
<pre class="highlight java"><code><span class="kn">import</span> <span class="nn">org.apache.hawq.pxf.api.Fragmenter</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">org.apache.hawq.pxf.api.Fragment</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">org.apache.hawq.pxf.api.utilities.InputData</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.util.List</span><span class="o">;</span>
<span class="cm">/*
* Class that defines the splitting of a data resource into fragments that can
* be processed in parallel
* getFragments() returns the fragments information of a given path (source name and location of each fragment).
* Used to get fragments of data that could be read in parallel from the different segments.
* Dummy implementation, for documentation
*/</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">DummyFragmenter</span> <span class="kd">extends</span> <span class="n">Fragmenter</span> <span class="o">{</span>
<span class="kd">public</span> <span class="nf">DummyFragmenter</span><span class="o">(</span><span class="n">InputData</span> <span class="n">metaData</span><span class="o">)</span> <span class="o">{</span>
<span class="kd">super</span><span class="o">(</span><span class="n">metaData</span><span class="o">);</span>
<span class="o">}</span>
<span class="cm">/*
* path is a data source URI that can appear as a file name, a directory name or a wildcard
* returns the data fragments - identifiers of data and a list of available hosts
*/</span>
<span class="nd">@Override</span>
<span class="kd">public</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">Fragment</span><span class="o">&gt;</span> <span class="nf">getFragments</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
<span class="n">String</span> <span class="n">localhostname</span> <span class="o">=</span> <span class="n">java</span><span class="o">.</span><span class="na">net</span><span class="o">.</span><span class="na">InetAddress</span><span class="o">.</span><span class="na">getLocalHost</span><span class="o">().</span><span class="na">getHostName</span><span class="o">();</span>
<span class="n">String</span><span class="o">[]</span> <span class="n">localHosts</span> <span class="o">=</span> <span class="k">new</span> <span class="n">String</span><span class="o">[]{</span><span class="n">localhostname</span><span class="o">,</span> <span class="n">localhostname</span><span class="o">};</span>
<span class="n">fragments</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">Fragment</span><span class="o">(</span><span class="n">inputData</span><span class="o">.</span><span class="na">getDataSource</span><span class="o">()</span> <span class="o">+</span> <span class="s">".1"</span> <span class="cm">/* source name */</span><span class="o">,</span>
<span class="n">localHosts</span> <span class="cm">/* available hosts list */</span><span class="o">,</span>
<span class="s">"fragment1"</span><span class="o">.</span><span class="na">getBytes</span><span class="o">()));</span>
<span class="n">fragments</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">Fragment</span><span class="o">(</span><span class="n">inputData</span><span class="o">.</span><span class="na">getDataSource</span><span class="o">()</span> <span class="o">+</span> <span class="s">".2"</span> <span class="cm">/* source name */</span><span class="o">,</span>
<span class="n">localHosts</span> <span class="cm">/* available hosts list */</span><span class="o">,</span>
<span class="s">"fragment2"</span><span class="o">.</span><span class="na">getBytes</span><span class="o">()));</span>
<span class="n">fragments</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">Fragment</span><span class="o">(</span><span class="n">inputData</span><span class="o">.</span><span class="na">getDataSource</span><span class="o">()</span> <span class="o">+</span> <span class="s">".3"</span> <span class="cm">/* source name */</span><span class="o">,</span>
<span class="n">localHosts</span> <span class="cm">/* available hosts list */</span><span class="o">,</span>
<span class="s">"fragment3"</span><span class="o">.</span><span class="na">getBytes</span><span class="o">()));</span>
<span class="k">return</span> <span class="n">fragments</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">}</span>
</code></pre>
<h4 id="dummy-accessor"><a id="dummyaccessor"></a>Dummy Accessor</h4>
<pre class="highlight java"><code><span class="kn">import</span> <span class="nn">org.apache.hawq.pxf.api.WriteAccessor</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">org.apache.hawq.pxf.api.OneRow</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">org.apache.hawq.pxf.api.utilities.InputData</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">org.apache.hawq.pxf.api.utilities.Plugin</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">org.apache.commons.logging.Log</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">org.apache.commons.logging.LogFactory</span><span class="o">;</span>
<span class="cm">/*
* Internal interface that defines the access to a file on HDFS. All classes
* that implement actual access to an HDFS file (sequence file, avro file,...)
* must respect this interface
* Dummy implementation, for documentation
*/</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">DummyAccessor</span> <span class="kd">extends</span> <span class="n">Plugin</span> <span class="kd">implements</span> <span class="n">ReadAccessor</span><span class="o">,</span> <span class="n">WriteAccessor</span> <span class="o">{</span>
<span class="kd">private</span> <span class="kd">static</span> <span class="kd">final</span> <span class="n">Log</span> <span class="n">LOG</span> <span class="o">=</span> <span class="n">LogFactory</span><span class="o">.</span><span class="na">getLog</span><span class="o">(</span><span class="n">DummyAccessor</span><span class="o">.</span><span class="na">class</span><span class="o">);</span>
<span class="kd">private</span> <span class="kt">int</span> <span class="n">rowNumber</span><span class="o">;</span>
<span class="kd">private</span> <span class="kt">int</span> <span class="n">fragmentNumber</span><span class="o">;</span>
<span class="kd">public</span> <span class="nf">DummyAccessor</span><span class="o">(</span><span class="n">InputData</span> <span class="n">metaData</span><span class="o">)</span> <span class="o">{</span>
<span class="kd">super</span><span class="o">(</span><span class="n">metaData</span><span class="o">);</span>
<span class="o">}</span>
<span class="nd">@Override</span>
<span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">openForRead</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
<span class="cm">/* fopen or similar */</span>
<span class="k">return</span> <span class="kc">true</span><span class="o">;</span>
<span class="o">}</span>
<span class="nd">@Override</span>
<span class="kd">public</span> <span class="n">OneRow</span> <span class="nf">readNextObject</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
<span class="cm">/* return next row , &lt;key=fragmentNo.rowNo, val=rowNo,text,fragmentNo&gt;*/</span>
<span class="cm">/* check for EOF */</span>
<span class="k">if</span> <span class="o">(</span><span class="n">fragmentNumber</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="o">)</span>
<span class="k">return</span> <span class="kc">null</span><span class="o">;</span> <span class="cm">/* signal EOF, close will be called */</span>
<span class="kt">int</span> <span class="n">fragment</span> <span class="o">=</span> <span class="n">inputData</span><span class="o">.</span><span class="na">getDataFragment</span><span class="o">();</span>
<span class="n">String</span> <span class="n">fragmentMetadata</span> <span class="o">=</span> <span class="k">new</span> <span class="n">String</span><span class="o">(</span><span class="n">inputData</span><span class="o">.</span><span class="na">getFragmentMetadata</span><span class="o">());</span>
<span class="cm">/* generate row */</span>
<span class="n">OneRow</span> <span class="n">row</span> <span class="o">=</span> <span class="k">new</span> <span class="n">OneRow</span><span class="o">(</span><span class="n">fragment</span> <span class="o">+</span> <span class="s">"."</span> <span class="o">+</span> <span class="n">rowNumber</span><span class="o">,</span> <span class="cm">/* key */</span>
<span class="n">rowNumber</span> <span class="o">+</span> <span class="s">","</span> <span class="o">+</span> <span class="n">fragmentMetadata</span> <span class="o">+</span> <span class="s">","</span> <span class="o">+</span> <span class="n">fragment</span> <span class="cm">/* value */</span><span class="o">);</span>
<span class="cm">/* advance */</span>
<span class="n">rowNumber</span> <span class="o">+=</span> <span class="mi">1</span><span class="o">;</span>
<span class="k">if</span> <span class="o">(</span><span class="n">rowNumber</span> <span class="o">==</span> <span class="mi">2</span><span class="o">)</span> <span class="o">{</span>
<span class="n">rowNumber</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
<span class="n">fragmentNumber</span> <span class="o">+=</span> <span class="mi">1</span><span class="o">;</span>
<span class="o">}</span>
<span class="cm">/* return data */</span>
<span class="k">return</span> <span class="n">row</span><span class="o">;</span>
<span class="o">}</span>
<span class="nd">@Override</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">closeForRead</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
<span class="cm">/* fclose or similar */</span>
<span class="o">}</span>
<span class="nd">@Override</span>
<span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">openForWrite</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
<span class="cm">/* fopen or similar */</span>
<span class="k">return</span> <span class="kc">true</span><span class="o">;</span>
<span class="o">}</span>
<span class="nd">@Override</span>
<span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">writeNextObject</span><span class="o">(</span><span class="n">OneRow</span> <span class="n">onerow</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
<span class="n">LOG</span><span class="o">.</span><span class="na">info</span><span class="o">(</span><span class="n">onerow</span><span class="o">.</span><span class="na">getData</span><span class="o">());</span>
<span class="k">return</span> <span class="kc">true</span><span class="o">;</span>
<span class="o">}</span>
<span class="nd">@Override</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">closeForWrite</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
<span class="cm">/* fclose or similar */</span>
<span class="o">}</span>
<span class="o">}</span>
</code></pre>
<h4 id="dummy-resolver"><a id="dummyresolver"></a>Dummy Resolver</h4>
<pre class="highlight java"><code><span class="kn">import</span> <span class="nn">org.apache.hawq.pxf.api.OneField</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">org.apache.hawq.pxf.api.OneRow</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">org.apache.hawq.pxf.api.ReadResolver</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">org.apache.hawq.pxf.api.WriteResolver</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">org.apache.hawq.pxf.api.utilities.InputData</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">org.apache.hawq.pxf.api.utilities.Plugin</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.util.LinkedList</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.util.List</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">static</span> <span class="n">org</span><span class="o">.</span><span class="na">apache</span><span class="o">.</span><span class="na">hawq</span><span class="o">.</span><span class="na">pxf</span><span class="o">.</span><span class="na">api</span><span class="o">.</span><span class="na">io</span><span class="o">.</span><span class="na">DataType</span><span class="o">.</span><span class="na">INTEGER</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">static</span> <span class="n">org</span><span class="o">.</span><span class="na">apache</span><span class="o">.</span><span class="na">hawq</span><span class="o">.</span><span class="na">pxf</span><span class="o">.</span><span class="na">api</span><span class="o">.</span><span class="na">io</span><span class="o">.</span><span class="na">DataType</span><span class="o">.</span><span class="na">VARCHAR</span><span class="o">;</span>
<span class="cm">/*
* Class that defines the deserializtion of one record brought from the external input data.
* Every implementation of a deserialization method (Writable, Avro, BP, Thrift, ...)
* must inherit this abstract class
* Dummy implementation, for documentation
*/</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">DummyResolver</span> <span class="kd">extends</span> <span class="n">Plugin</span> <span class="kd">implements</span> <span class="n">ReadResolver</span><span class="o">,</span> <span class="n">WriteResolver</span> <span class="o">{</span>
<span class="kd">private</span> <span class="kt">int</span> <span class="n">rowNumber</span><span class="o">;</span>
<span class="kd">public</span> <span class="nf">DummyResolver</span><span class="o">(</span><span class="n">InputData</span> <span class="n">metaData</span><span class="o">)</span> <span class="o">{</span>
<span class="kd">super</span><span class="o">(</span><span class="n">metaData</span><span class="o">);</span>
<span class="n">rowNumber</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
<span class="o">}</span>
<span class="nd">@Override</span>
<span class="kd">public</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">OneField</span><span class="o">&gt;</span> <span class="nf">getFields</span><span class="o">(</span><span class="n">OneRow</span> <span class="n">row</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
<span class="cm">/* break up the row into fields */</span>
<span class="n">List</span><span class="o">&lt;</span><span class="n">OneField</span><span class="o">&gt;</span> <span class="n">output</span> <span class="o">=</span> <span class="k">new</span> <span class="n">LinkedList</span><span class="o">&lt;</span><span class="n">OneField</span><span class="o">&gt;();</span>
<span class="n">String</span><span class="o">[]</span> <span class="n">fields</span> <span class="o">=</span> <span class="o">((</span><span class="n">String</span><span class="o">)</span> <span class="n">row</span><span class="o">.</span><span class="na">getData</span><span class="o">()).</span><span class="na">split</span><span class="o">(</span><span class="s">","</span><span class="o">);</span>
<span class="n">output</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">OneField</span><span class="o">(</span><span class="n">INTEGER</span><span class="o">.</span><span class="na">getOID</span><span class="o">()</span> <span class="cm">/* type */</span><span class="o">,</span> <span class="n">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span><span class="n">fields</span><span class="o">[</span><span class="mi">0</span><span class="o">])</span> <span class="cm">/* value */</span><span class="o">));</span>
<span class="n">output</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">OneField</span><span class="o">(</span><span class="n">VARCHAR</span><span class="o">.</span><span class="na">getOID</span><span class="o">(),</span> <span class="n">fields</span><span class="o">[</span><span class="mi">1</span><span class="o">]));</span>
<span class="n">output</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="n">OneField</span><span class="o">(</span><span class="n">INTEGER</span><span class="o">.</span><span class="na">getOID</span><span class="o">(),</span> <span class="n">Integer</span><span class="o">.</span><span class="na">parseInt</span><span class="o">(</span><span class="n">fields</span><span class="o">[</span><span class="mi">2</span><span class="o">])));</span>
<span class="k">return</span> <span class="n">output</span><span class="o">;</span>
<span class="o">}</span>
<span class="nd">@Override</span>
<span class="kd">public</span> <span class="n">OneRow</span> <span class="nf">setFields</span><span class="o">(</span><span class="n">List</span><span class="o">&lt;</span><span class="n">OneField</span><span class="o">&gt;</span> <span class="n">record</span><span class="o">)</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
<span class="cm">/* should read inputStream row by row */</span>
<span class="k">return</span> <span class="n">rowNumber</span> <span class="o">&gt;</span> <span class="mi">5</span>
<span class="o">?</span> <span class="kc">null</span>
<span class="o">:</span> <span class="k">new</span> <span class="n">OneRow</span><span class="o">(</span><span class="kc">null</span><span class="o">,</span> <span class="s">"row number "</span> <span class="o">+</span> <span class="n">rowNumber</span><span class="o">++);</span>
<span class="o">}</span>
<span class="o">}</span>
</code></pre>
<h4 id="usage-example"><a id="usageexample"></a>Usage Example</h4>
<pre class="highlight sql"><code><span class="n">psql</span><span class="o">=#</span> <span class="k">CREATE</span> <span class="k">EXTERNAL</span> <span class="k">TABLE</span> <span class="n">dummy_tbl</span>
<span class="p">(</span><span class="n">int1</span> <span class="n">integer</span><span class="p">,</span> <span class="n">word</span> <span class="n">text</span><span class="p">,</span> <span class="n">int2</span> <span class="n">integer</span><span class="p">)</span>
<span class="k">LOCATION</span> <span class="p">(</span><span class="s1">'pxf://localhost:51200/dummy_location'</span>
<span class="s1">'?FRAGMENTER=DummyFragmenter'</span>
<span class="s1">'&amp;ACCESSOR=DummyAccessor'</span>
<span class="s1">'&amp;RESOLVER=DummyResolver'</span><span class="p">)</span>
<span class="n">FORMAT</span> <span class="s1">'custom'</span> <span class="p">(</span><span class="n">formatter</span> <span class="o">=</span> <span class="s1">'pxfwritable_import'</span><span class="p">);</span>
<span class="k">CREATE</span> <span class="k">EXTERNAL</span> <span class="k">TABLE</span>
<span class="n">psql</span><span class="o">=#</span> <span class="k">SELECT</span> <span class="o">*</span> <span class="k">FROM</span> <span class="n">dummy_tbl</span><span class="p">;</span>
<span class="n">int1</span> <span class="o">|</span> <span class="n">word</span> <span class="o">|</span> <span class="n">int2</span>
<span class="c1">------+------+------</span>
<span class="mi">0</span> <span class="o">|</span> <span class="n">fragment1</span> <span class="o">|</span> <span class="mi">0</span>
<span class="mi">1</span> <span class="o">|</span> <span class="n">fragment1</span> <span class="o">|</span> <span class="mi">0</span>
<span class="mi">0</span> <span class="o">|</span> <span class="n">fragment2</span> <span class="o">|</span> <span class="mi">0</span>
<span class="mi">1</span> <span class="o">|</span> <span class="n">fragment2</span> <span class="o">|</span> <span class="mi">0</span>
<span class="mi">0</span> <span class="o">|</span> <span class="n">fragment3</span> <span class="o">|</span> <span class="mi">0</span>
<span class="mi">1</span> <span class="o">|</span> <span class="n">fragment3</span> <span class="o">|</span> <span class="mi">0</span>
<span class="p">(</span><span class="mi">6</span> <span class="k">rows</span><span class="p">)</span>
<span class="n">psql</span><span class="o">=#</span> <span class="k">CREATE</span> <span class="n">WRITABLE</span> <span class="k">EXTERNAL</span> <span class="k">TABLE</span> <span class="n">dummy_tbl_write</span>
<span class="p">(</span><span class="n">int1</span> <span class="n">integer</span><span class="p">,</span> <span class="n">word</span> <span class="n">text</span><span class="p">,</span> <span class="n">int2</span> <span class="n">integer</span><span class="p">)</span>
<span class="k">LOCATION</span> <span class="p">(</span><span class="s1">'pxf://localhost:51200/dummy_location'</span>
<span class="s1">'?ACCESSOR=DummyAccessor'</span>
<span class="s1">'&amp;RESOLVER=DummyResolver'</span><span class="p">)</span>
<span class="n">FORMAT</span> <span class="s1">'custom'</span> <span class="p">(</span><span class="n">formatter</span> <span class="o">=</span> <span class="s1">'pxfwritable_export'</span><span class="p">);</span>
<span class="k">CREATE</span> <span class="k">EXTERNAL</span> <span class="k">TABLE</span>
<span class="n">psql</span><span class="o">=#</span> <span class="k">INSERT</span> <span class="k">INTO</span> <span class="n">dummy_tbl_write</span> <span class="k">VALUES</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="s1">'a'</span><span class="p">,</span> <span class="mi">11</span><span class="p">),</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="s1">'b'</span><span class="p">,</span> <span class="mi">22</span><span class="p">);</span>
<span class="k">INSERT</span> <span class="mi">0</span> <span class="mi">2</span>
</code></pre>
</main>
</div>
</div>
</div>
<div id="scrim"></div>
<div class="container">
<footer class="site-footer-links">
</footer>
</div><!--end of container-->
</body>
</html>