Before checking the specific syntax, let's take a look on how to setup your environment to load needed plugins.
Setup
To load data directly from ElasticSearch you need to download the elasticsearch-hadoop
plugin. You have different ways to make it work, for a quick setup you can do the following.
In order to make it work, you need to put the jar file elasticsearch-hadoop-<version>.jar
in a folder of the node where you have the pig server installed. In my case - quite common googling around - I also needed to add commons-httpclient-<version>.jar
inside that folder.
Then you can run pig
in shell mode (called grunt
) simply typing pig
on the console. Then you have to load those two jars in the following way:
REGISTER /path/to/jars/commons-httpclient-<version>.jar;
REGISTER /path/to/jars/elasticsearch-hadoop-<version>.jar;
Now you are ready to write some code.
Example
Let's check the syntax to load data from a complex case.
DATA = LOAD 'my_index/log' USING org.elasticsearch.hadoop.pig.EsStorage(
'es.nodes=https://server1:port1,https://server2:port2,https://server3:port3',
'es.query=?q=*',
'es.net.ssl=true',
'es.net.http.auth.user=user',
'es.net.http.auth.pass=pass',
'es.net.ssl.keystore.type=JKS',
'es.net.ssl.truststore.location=file:///path/to/truststore.jks',
'es.net.ssl.truststore.pass=pass');
This is the complete example, now let's analyze it step by step.
es.nodes
holds the list of the nodes of your ElasticSearch cluster. You have to specify your nodes as a comma separated list, with the associated port.es.query
holds the query that will be submitted to ElasticSearch in order to fetch data. You can also put a query in DSL format, but be careful that only the match part of the query will be considered! If you try to limit the number of fields through the query DSL it won't work: in order to achieve that you need to use the es.read.source.filter
parameter. example of a query DSL: 'es.query = { "query":{ "match_all":{} } }'
es.net.ssl=true
is self explanatory, you need also to give the login credentials to ElasticSearch with es.net.http.auth.user
and es.net.http.auth.pass
.es.net.ssl.keystore.type
if you need a truststore, you can select here the type. In the es.net.ssl.truststore.location
parameter you set the location of the file, be careful to add file://
prefix, and in the es.net.ssl.truststore.pass
parameter you set the password of the truststore file.Some useful settings
es.read.source.filter=field1,field2,field3
allows you to fetch only the specified fields from ElasticSearch (in this example three).es.output.json=true
allows you to fetch data in a key-value format (JSON). Setting to false
will return data in CSV format (default).