Beispiel #1
0
        public static void Example()
        {
            // Create an Amazon Athena client
            var athenaConfig = new AmazonAthenaConfig
            {
                RegionEndpoint = RegionEndpoint.USEast1,
                Timeout        = TimeSpan.FromMilliseconds(ExampleConstants.CLIENT_EXECUTION_TIMEOUT)
            };
            var athenaClient = new AmazonAthenaClient(config: athenaConfig);

            String sampleQueryExecutionId = submitAthenaQuery(athenaClient);

            // Submit the stop query Request
            var stopQueryExecutionRequest = new StopQueryExecutionRequest()
            {
                QueryExecutionId = sampleQueryExecutionId
            };

            var stopQueryExecutionResponse = athenaClient.StopQueryExecution(stopQueryExecutionRequest);

            // Ensure that the query was stopped
            var getQueryExecutionRequest = new GetQueryExecutionRequest()
            {
                QueryExecutionId = sampleQueryExecutionId
            };


            var getQueryExecutionResponse = athenaClient.GetQueryExecution(getQueryExecutionRequest);

            if (getQueryExecutionResponse.QueryExecution.Status.State == QueryExecutionState.CANCELLED)
            {
                Console.WriteLine("Query has been cancelled");
            }
        }
        internal virtual GetQueryExecutionResponse GetQueryExecution(GetQueryExecutionRequest request)
        {
            var marshaller   = GetQueryExecutionRequestMarshaller.Instance;
            var unmarshaller = GetQueryExecutionResponseUnmarshaller.Instance;

            return(Invoke <GetQueryExecutionRequest, GetQueryExecutionResponse>(request, marshaller, unmarshaller));
        }
Beispiel #3
0
        /**
         * Wait for an Athena query to complete, fail or to be cancelled. This is done by polling Athena over an
         * interval of time. If a query fails or is cancelled, then it will throw an exception.
         */
        private static void waitForQueryToComplete(AmazonAthenaClient athenaClient, String queryExecutionId)
        {
            var getQueryExecutionRequest = new GetQueryExecutionRequest()
            {
                QueryExecutionId = queryExecutionId
            };

            GetQueryExecutionResponse getQueryExecutionResponse = null;
            bool isQueryStillRunning = true;

            while (isQueryStillRunning)
            {
                getQueryExecutionResponse = athenaClient.GetQueryExecution(getQueryExecutionRequest);
                var queryState = getQueryExecutionResponse.QueryExecution.Status.State;
                if (queryState == QueryExecutionState.FAILED)
                {
                    throw new Exception("Query Failed to run with Error Message: " + getQueryExecutionResponse.QueryExecution.Status.StateChangeReason);
                }
                else if (queryState == QueryExecutionState.CANCELLED)
                {
                    throw new Exception("Query was cancelled.");
                }
                else if (queryState == QueryExecutionState.SUCCEEDED)
                {
                    isQueryStillRunning = false;
                }
                else
                {
                    // Sleep an amount of time before retrying again.
                    Thread.Sleep(TimeSpan.FromMilliseconds(ExampleConstants.SLEEP_AMOUNT_IN_MS));
                }
                Console.WriteLine("Current Status is: " + queryState);
            }
        }
Beispiel #4
0
        public async Task <bool> IsExecutionCompleted(string executionId) // Task<GetQueryResultsResponse>
        {
            GetQueryExecutionRequest getQueryExecutionRequest = new GetQueryExecutionRequest()
            {
                QueryExecutionId = executionId
            };

            bool completed         = false;
            var  executionResponse = await amazonAthenaClient.GetQueryExecutionAsync(getQueryExecutionRequest);

            var state = executionResponse.QueryExecution.Status.State;

            if (state == QueryExecutionState.FAILED)
            {
                throw new Exception($"Query Failed to run with Error Message: \n{executionResponse.QueryExecution.Status.StateChangeReason}");
            }
            else if (state == QueryExecutionState.CANCELLED)
            {
                throw new Exception($"Query was cancelled.");
            }
            else if (state == QueryExecutionState.SUCCEEDED)
            {
                completed = true;
            }
            return(completed);
        }
        private async Task WaitForQueryToComplete(AmazonAthenaClient client, string queryExecutionId)
        {
            GetQueryExecutionRequest getQueryExecutionRequest = new GetQueryExecutionRequest();

            getQueryExecutionRequest.QueryExecutionId = queryExecutionId;

            bool isQueryStillRunning = true;

            while (isQueryStillRunning)
            {
                var queryExecutionResponse = await client.GetQueryExecutionAsync(getQueryExecutionRequest);


                QueryExecutionStatus queryStatus = queryExecutionResponse.QueryExecution.Status;

                if (queryStatus.State == QueryExecutionState.FAILED)
                {
                    throw new Exception("Query Failed to run with Error Message: " + queryExecutionResponse.QueryExecution.Status.StateChangeReason);
                }
                else if (queryStatus.State == QueryExecutionState.CANCELLED)
                {
                    throw new Exception("Query was cancelled.");
                }
                else if (queryStatus.State == QueryExecutionState.SUCCEEDED)
                {
                    isQueryStillRunning = false;
                }

                // Sleep an amount before retrying again.
                Console.WriteLine("Current Status is: " + queryStatus.State.Value);
                Thread.Sleep(new TimeSpan(0, 0, 1));
            }
        }
Beispiel #6
0
        /// <summary>
        /// Returns information about a single execution of a query. Each time a query executes,
        /// information about the query execution is saved with a unique ID.
        /// </summary>
        /// <param name="request">Container for the necessary parameters to execute the GetQueryExecution service method.</param>
        ///
        /// <returns>The response from the GetQueryExecution service method, as returned by Athena.</returns>
        /// <exception cref="Amazon.Athena.Model.InternalServerException">
        /// Indicates a platform issue, which may be due to a transient condition or outage.
        /// </exception>
        /// <exception cref="Amazon.Athena.Model.InvalidRequestException">
        /// Indicates that something is wrong with the input to the request. For example, a required
        /// parameter may be missing or out of range.
        /// </exception>
        /// <seealso href="http://docs.aws.amazon.com/goto/WebAPI/athena-2017-05-18/GetQueryExecution">REST API Reference for GetQueryExecution Operation</seealso>
        public GetQueryExecutionResponse GetQueryExecution(GetQueryExecutionRequest request)
        {
            var marshaller   = new GetQueryExecutionRequestMarshaller();
            var unmarshaller = GetQueryExecutionResponseUnmarshaller.Instance;

            return(Invoke <GetQueryExecutionRequest, GetQueryExecutionResponse>(request, marshaller, unmarshaller));
        }
        /// <summary>
        /// Initiates the asynchronous execution of the GetQueryExecution operation.
        /// </summary>
        ///
        /// <param name="request">Container for the necessary parameters to execute the GetQueryExecution operation.</param>
        /// <param name="cancellationToken">
        ///     A cancellation token that can be used by other objects or threads to receive notice of cancellation.
        /// </param>
        /// <returns>The task object representing the asynchronous operation.</returns>
        /// <seealso href="http://docs.aws.amazon.com/goto/WebAPI/athena-2017-05-18/GetQueryExecution">REST API Reference for GetQueryExecution Operation</seealso>
        public virtual Task <GetQueryExecutionResponse> GetQueryExecutionAsync(GetQueryExecutionRequest request, System.Threading.CancellationToken cancellationToken = default(CancellationToken))
        {
            var marshaller   = GetQueryExecutionRequestMarshaller.Instance;
            var unmarshaller = GetQueryExecutionResponseUnmarshaller.Instance;

            return(InvokeAsync <GetQueryExecutionRequest, GetQueryExecutionResponse>(request, marshaller,
                                                                                     unmarshaller, cancellationToken));
        }
Beispiel #8
0
        internal virtual GetQueryExecutionResponse GetQueryExecution(GetQueryExecutionRequest request)
        {
            var options = new InvokeOptions();

            options.RequestMarshaller    = GetQueryExecutionRequestMarshaller.Instance;
            options.ResponseUnmarshaller = GetQueryExecutionResponseUnmarshaller.Instance;

            return(Invoke <GetQueryExecutionResponse>(request, options));
        }
Beispiel #9
0
        async static Task <List <Dictionary <String, String> > > getQueryExecution(IAmazonAthena client, String id)
        {
            List <Dictionary <String, String> > items   = new List <Dictionary <String, String> >();
            GetQueryExecutionResponse           results = null;
            QueryExecution q = null;
            /* Declare query execution request object */
            GetQueryExecutionRequest qReq = new GetQueryExecutionRequest()
            {
                QueryExecutionId = id
            };

            /* Poll API to determine when the query completed */
            do
            {
                results = await client.GetQueryExecutionAsync(qReq);

                q = results.QueryExecution;

                await Task.Delay(5000); //Wait for 5sec before polling again
            } while (q.Status.State == "RUNNING" || q.Status.State == "QUEUED");

            Console.WriteLine("Data Scanned for {0}: {1} Bytes", id, q.Statistics.DataScannedInBytes);

            /* Declare query results request object */
            GetQueryResultsRequest resReq = new GetQueryResultsRequest()
            {
                QueryExecutionId = id,
                MaxResults       = 10
            };

            GetQueryResultsResponse resResp = null;

            /* Page through results and request additional pages if available */
            do
            {
                resResp = await client.GetQueryResultsAsync(resReq);

                /* Loop over result set and create a dictionary with column name for key and data for value */
                foreach (Row row in resResp.ResultSet.Rows)
                {
                    Dictionary <String, String> dict = new Dictionary <String, String>();
                    for (var i = 0; i < resResp.ResultSet.ResultSetMetadata.ColumnInfo.Count; i++)
                    {
                        dict.Add(resResp.ResultSet.ResultSetMetadata.ColumnInfo[i].Name, row.Data[i].VarCharValue);
                    }
                    items.Add(dict);
                }

                if (resResp.NextToken != null)
                {
                    resReq.NextToken = resResp.NextToken;
                }
            } while (resResp.NextToken != null);

            /* Return List of dictionary per row containing column name and value */
            return(items);
        }
Beispiel #10
0
        /// <summary>
        /// Initiates the asynchronous execution of the GetQueryExecution operation.
        /// </summary>
        ///
        /// <param name="request">Container for the necessary parameters to execute the GetQueryExecution operation.</param>
        /// <param name="cancellationToken">
        ///     A cancellation token that can be used by other objects or threads to receive notice of cancellation.
        /// </param>
        /// <returns>The task object representing the asynchronous operation.</returns>
        /// <seealso href="http://docs.aws.amazon.com/goto/WebAPI/athena-2017-05-18/GetQueryExecution">REST API Reference for GetQueryExecution Operation</seealso>
        public virtual Task <GetQueryExecutionResponse> GetQueryExecutionAsync(GetQueryExecutionRequest request, System.Threading.CancellationToken cancellationToken = default(CancellationToken))
        {
            var options = new InvokeOptions();

            options.RequestMarshaller    = GetQueryExecutionRequestMarshaller.Instance;
            options.ResponseUnmarshaller = GetQueryExecutionResponseUnmarshaller.Instance;

            return(InvokeAsync <GetQueryExecutionResponse>(request, options, cancellationToken));
        }
Beispiel #11
0
        public async Task <GetQueryResultsRequest> ExecuteQuery(string query) // Task<GetQueryResultsResponse>
        {
            var startResponse = await amazonAthenaClient.StartQueryExecutionAsync(new StartQueryExecutionRequest()
            {
                QueryString         = query,
                ResultConfiguration = new ResultConfiguration()
                {
                    OutputLocation = awsAthenaOptions.DefaultOutputLocation,
                }
            });

            var queryId = startResponse.QueryExecutionId;

            GetQueryExecutionRequest getQueryExecutionRequest = new GetQueryExecutionRequest()
            {
                QueryExecutionId = queryId
            };

            bool isStillingRunning = true;

            while (isStillingRunning)
            {
                var executionResponse = await amazonAthenaClient.GetQueryExecutionAsync(getQueryExecutionRequest);

                var state = executionResponse.QueryExecution.Status.State;

                if (state == QueryExecutionState.FAILED)
                {
                    throw new Exception($"Query Failed to run with Error Message: \n{executionResponse.QueryExecution.Status.StateChangeReason}");
                }
                else if (state == QueryExecutionState.CANCELLED)
                {
                    throw new Exception($"Query was cancelled.");
                }
                else if (state == QueryExecutionState.SUCCEEDED)
                {
                    isStillingRunning = false;
                }
            }

            return(new GetQueryResultsRequest()
            {
                QueryExecutionId = queryId
            });

            //var resultResponse = await amazonAthenaClient.GetQueryResultsAsync(new GetQueryResultsRequest()
            //{
            //    QueryExecutionId = queryId
            //});

            //return resultResponse;
        }
Beispiel #12
0
        public static async Task <GetQueryResultsResponse> QueryAsyncLight(this AmazonAthenaClient client, StartQueryExecutionRequest request, int timeoutSeconds)
        {
            var executionResult = await client.StartQueryExecutionAsync(request);

            var queryExecutionRequest = new GetQueryExecutionRequest
            {
                QueryExecutionId = executionResult.QueryExecutionId
            };

            return(await Task.Run <GetQueryResultsResponse>(async() =>
            {
                var start = DateTime.Now;
                while ((DateTime.Now - start).Seconds < timeoutSeconds)
                {
                    await Task.Delay(1000);
                    var response = await client.GetQueryExecutionAsync(queryExecutionRequest);
                    switch (response.QueryExecution.Status.State)
                    {
                    case var queued when queued == QueryExecutionState.QUEUED:
                    case var running when running == QueryExecutionState.RUNNING:
                        continue;

                    case var cancelled when cancelled == QueryExecutionState.CANCELLED:
                        {
                            throw new AthenaQueryExecutionException($"The query({executionResult.QueryExecutionId}) has been calceled", response);
                        }

                    case var failed when failed == QueryExecutionState.FAILED:
                        {
                            throw new AthenaQueryExecutionException($"The query({executionResult.QueryExecutionId}) failed", response);
                        }

                    case var secceeded when secceeded == QueryExecutionState.SUCCEEDED:
                        {
                            var resultRequest = new GetQueryResultsRequest
                            {
                                QueryExecutionId = executionResult.QueryExecutionId
                            };

                            var result = await client.GetQueryResultsAsync(resultRequest);
                            return result;
                        }

                    default:
                        throw new AthenaQueryExecutionException($"Unrecognized query({response.QueryExecution.QueryExecutionId}) State", response);
                    }
                }
                throw new AthenaQueryExecutionException($"query({executionResult.QueryExecutionId}) Timeout", null);
            }));
        }
        /// <summary>
        ///  Poll API to determine when the query completed
        /// </summary>
        public async Task PoolQueryExecutionAsync(string queryExecutionId, int delayMs = 5000)
        {
            QueryExecution queryExecution = null;

            var executingStates = new string[] { QueryExecutionState.RUNNING, QueryExecutionState.QUEUED };
            var unsuccessStates = new string[] { QueryExecutionState.CANCELLED, QueryExecutionState.FAILED };

            do
            {
                try
                {
                    _logger.LogDebug($"PoolQueryExecutionAsync for 'queryExecutionId': '{queryExecutionId}'.");

                    var getQueryExecutionRequest = new GetQueryExecutionRequest()
                    {
                        QueryExecutionId = queryExecutionId
                    };

                    var client = _amazonAthenaClientFactory.Create();
                    var getQueryExecutionAsyncResponse = await client.GetQueryExecutionAsync(getQueryExecutionRequest);

                    getQueryExecutionAsyncResponse.EnsureSuccessStatusCode();
                    queryExecution = getQueryExecutionAsyncResponse.QueryExecution;

                    _logger.LogDebug($"PoolQueryExecutionAsync state '{queryExecution.Status.State}', StateChangeReason: '{queryExecution.Status.StateChangeReason}' for 'queryExecutionId': '{queryExecutionId}'.");

                    if (unsuccessStates.Any(state => queryExecution.Status.State.Equals(state)))
                    {
                        throw new Exception($"QueryExecution for 'queryExecutionId': '{queryExecutionId}' failed.",
                                            new Exception($"State '{queryExecution.Status.State}', StateChangeReason: '{queryExecution.Status.StateChangeReason}'."));
                    }

                    await Task.Delay(delayMs);
                }
                catch (InvalidRequestException e)
                {
                    _logger.LogError(e, $"Exception while executing PoolQueryExecutionAsync for 'queryExecutionId': '{queryExecutionId}'.");
                }
            }while (executingStates.Any(state => queryExecution.Status.State.Equals(state)));

            _logger.LogDebug($"Data Scanned for '{queryExecutionId}': '{queryExecution.Statistics.DataScannedInBytes}' Bytes.");
        }
Beispiel #14
0
        public async Task <List <T> > TryObtainQueryResultById <T>(string queryId, int skip = 1) where T : class, new()
        {
            GetQueryExecutionRequest getQueryExecutionRequest = new GetQueryExecutionRequest()
            {
                QueryExecutionId = queryId
            };

            bool isStillingRunning = true;
            var  executionResponse = await amazonAthenaClient.GetQueryExecutionAsync(getQueryExecutionRequest);

            var state = executionResponse.QueryExecution.Status.State;

            if (state == QueryExecutionState.FAILED)
            {
                throw new Exception($"Query Failed to run with Error Message: \n{executionResponse.QueryExecution.Status.StateChangeReason}");
            }
            else if (state == QueryExecutionState.CANCELLED)
            {
                throw new Exception($"Query was cancelled.");
            }
            else if (state == QueryExecutionState.SUCCEEDED)
            {
                isStillingRunning = false;
            }
            if (isStillingRunning)
            {
                return(null);
            }

            var resultResponse = await amazonAthenaClient.GetQueryResultsAsync(new GetQueryResultsRequest()
            {
                QueryExecutionId = queryId
            });

            return(resultResponse.ReadRows <T>(skip));
        }
        public string ExecuteQuery(string query, ref QueryStageStatistics queryStats)
        {
            #region Setup

            QueryExecutionContext queryExecContext = new QueryExecutionContext()
            {
                Database = this.DataBase
            };

            ResultConfiguration resultConfig = new ResultConfiguration()
            {
                OutputLocation = this.OutputLocation
            };

            StartQueryExecutionRequest startQueryExecRequest = new StartQueryExecutionRequest()
            {
                QueryExecutionContext = queryExecContext,
                QueryString           = query,
                ResultConfiguration   = resultConfig
            };

            #endregion

            var watch = new Stopwatch();

            #region Query Execution
            //Start Query execution and wait till start command has completed
            var startQueryExecResult = _athenaClient.StartQueryExecutionAsync(startQueryExecRequest);

            //Start measurement
            watch.Start();

            while (!startQueryExecResult.IsCompleted)
            {
                Thread.Sleep(100);
                Console.Write($"\r START {watch.Elapsed}");
            }

            if (startQueryExecResult.Exception != null)
            {
                throw new Exception("Query Execution", startQueryExecResult.Exception);
            }

            if (startQueryExecResult.IsCanceled)
            {
                return("- Cancelled -");
            }

            //Query if query execution has finished
            GetQueryExecutionRequest getQueryExecRequest = new GetQueryExecutionRequest()
            {
                QueryExecutionId = startQueryExecResult.Result.QueryExecutionId
            };

            Task <Amazon.Athena.Model.GetQueryExecutionResponse> getQueryExecResult = null;

            bool isQueryRunning = true;
            while (isQueryRunning)
            {
                getQueryExecResult = _athenaClient.GetQueryExecutionAsync(getQueryExecRequest);
                var state = getQueryExecResult.Result.QueryExecution.Status.State;

                if (state == Amazon.Athena.QueryExecutionState.FAILED)
                {
                    throw new Exception("Query Execution", getQueryExecResult.Exception);
                }
                else if (state == Amazon.Athena.QueryExecutionState.CANCELLED)
                {
                    return("- Canceled -");
                }
                else if (state == Amazon.Athena.QueryExecutionState.SUCCEEDED)
                {
                    isQueryRunning = false;
                    queryStats.QueryExecutionTime = watch.Elapsed;
                }
                else
                {
                    Thread.Sleep(100);
                    Console.Write($"\r EXEC  {watch.Elapsed}");
                }
            }

            queryStats.EngineExecutionTimeInMillis = getQueryExecResult.Result.QueryExecution.Statistics.EngineExecutionTimeInMillis;
            queryStats.DataScannedInBytes          = getQueryExecResult.Result.QueryExecution.Statistics.DataScannedInBytes;

            #endregion

            watch.Restart();

            #region Get Query Result

            GetQueryResultsRequest getQueryResultRequest = new GetQueryResultsRequest()
            {
                QueryExecutionId = getQueryExecResult.Result.QueryExecution.QueryExecutionId
            };

            var getQueryResultsResult = _athenaClient.GetQueryResultsAsync(getQueryResultRequest);

            //No data process is taken account. Only take meassurements.
            long contentSize = 0, totalRows = 0;

            while (true)
            {
                while (!getQueryResultsResult.IsCompleted)
                {
                    Thread.Sleep(100);
                    Console.Write($"\r FETCH {watch.Elapsed}");
                }

                if (getQueryResultsResult.Exception != null)
                {
                    throw new Exception("Retrieving Query Rows", getQueryResultsResult.Exception);
                }

                if (getQueryResultsResult.IsCanceled)
                {
                    return("- Canceled -");
                }

                //while(getQueryResultsResult.Status == System.Threading.Tasks.TaskStatus.Running)
                //{
                //    Thread.Sleep(100);
                //    Console.Write(".");
                //}

                totalRows += getQueryResultsResult.Result.ResultSet.Rows.Count;

                if (getQueryResultsResult.Result.NextToken == null || totalRows >= SampleContext.MAX_FETCHED_RECORDS)
                {
                    queryStats.DataFetchingTime = watch.Elapsed;
                    contentSize += getQueryResultsResult.Result.ContentLength;

                    break;
                }

                getQueryResultsResult = _athenaClient.GetQueryResultsAsync(new GetQueryResultsRequest()
                {
                    QueryExecutionId = getQueryResultRequest.QueryExecutionId,
                    NextToken        = getQueryResultRequest.NextToken
                }
                                                                           );
            }

            #endregion

            return($"{contentSize} bytes took {queryStats.QueryExecutionTime} executing query and {queryStats.DataFetchingTime} fetching first {SampleContext.MAX_FETCHED_RECORDS} records.");
        }
        public async Task <List <Dictionary <string, string> > > GetQueryExecution(IAmazonAthena client, string id)
        {
            List <Dictionary <String, String> > items   = new List <Dictionary <String, String> >();
            GetQueryExecutionResponse           results = null;
            QueryExecution queryExecution = null;
            /* Declare query execution request object */
            GetQueryExecutionRequest queryExReq = new GetQueryExecutionRequest()
            {
                QueryExecutionId = id
            };

            /* Poll API to determine when the query completed */
            do
            {
                try
                {
                    results = await client.GetQueryExecutionAsync(queryExReq);

                    queryExecution = results.QueryExecution;
                    _logger.LogInformation("Status: {0}... {1}", queryExecution.Status.State, queryExecution.Status.StateChangeReason);

                    await Task.Delay(5000); //Wait for 5sec before polling again
                }
                catch (InvalidRequestException e)
                {
                    _logger.LogInformation("GetQueryExec Error: {0}", e.Message);
                }
            } while (queryExecution.Status.State == "RUNNING" || queryExecution.Status.State == "QUEUED");

            _logger.LogInformation("Data Scanned for {0}: {1} Bytes", id, queryExecution.Statistics.DataScannedInBytes);

            /* Declare query results request object */
            GetQueryResultsRequest queryResultRequest = new GetQueryResultsRequest()
            {
                QueryExecutionId = id,
                MaxResults       = 10
            };

            GetQueryResultsResponse queryResult = null;

            /* Page through results and request additional pages if available */
            do
            {
                queryResult = await client.GetQueryResultsAsync(queryResultRequest);

                /* Loop over result set and create a dictionary with column name for key and data for value */
                foreach (Row row in queryResult.ResultSet.Rows)
                {
                    Dictionary <String, String> dict = new Dictionary <String, String>();
                    for (var i = 0; i < queryResult.ResultSet.ResultSetMetadata.ColumnInfo.Count; i++)
                    {
                        dict.Add(queryResult.ResultSet.ResultSetMetadata.ColumnInfo[i].Name, row.Data[i].VarCharValue);
                    }

                    items.Add(dict);
                }

                if (queryResult.NextToken != null)
                {
                    queryResultRequest.NextToken = queryResult.NextToken;
                }
            } while (queryResult.NextToken != null);

            /* Return List of dictionary per row containing column name and value */
            return(items);
        }
Beispiel #17
0
        public APIGatewayProxyResponse Get(APIGatewayProxyRequest request, ILambdaContext context)
        {
            context.Logger.LogLine("Get Request\n");

            using (var client = new AmazonAthenaClient(Amazon.RegionEndpoint.USEast1))
            {
                String date = JsonConvert.DeserializeObject <String>(request?.Body);
                QueryExecutionContext qContext = new QueryExecutionContext();
                qContext.Database = ATHENA_DB;
                ResultConfiguration resConf = new ResultConfiguration();
                resConf.OutputLocation = ATHENA_TEMP_PATH;

                Console.WriteLine("Created Athena Client");
                run(client, qContext, resConf, date).Wait();
            }

            async Task run(IAmazonAthena client, QueryExecutionContext qContext, ResultConfiguration resConf, String date)
            {
                StartQueryExecutionRequest qReq = new StartQueryExecutionRequest()
                {
                    QueryString           = "SELECT emp_name FROM emp_table WHERE date = " + date + "limit 10;",
                    QueryExecutionContext = qContext,
                    ResultConfiguration   = resConf
                };

                try
                {
                    StartQueryExecutionResponse qRes = await client.StartQueryExecutionAsync(qReq);

                    List <Dictionary <String, String> > items = await getQueryExecution(client, qRes.QueryExecutionId);

                    foreach (var item in items)
                    {
                        foreach (KeyValuePair <String, String> pair in item)
                        {
                            Console.WriteLine("Col: {0}", pair.Key);
                            Console.WriteLine("Val: {0}", pair.Value);
                        }
                    }
                }
                catch (InvalidRequestException e)
                {
                    Console.WriteLine("Run Error: {0}", e.Message);
                }
            }

            async Task <List <Dictionary <String, String> > > getQueryExecution(IAmazonAthena client, String id)
            {
                List <Dictionary <String, String> > items   = new List <Dictionary <String, String> >();
                GetQueryExecutionResponse           results = null;
                QueryExecution q = null;

                GetQueryExecutionRequest qReq = new GetQueryExecutionRequest()
                {
                    QueryExecutionId = id
                };

                do
                {
                    try
                    {
                        results = await client.GetQueryExecutionAsync(qReq);

                        q = results.QueryExecution;
                        Console.WriteLine("Status: {0}... {1}", q.Status.State, q.Status.StateChangeReason);

                        await Task.Delay(5000);
                    }
                    catch (InvalidRequestException e)
                    {
                        Console.WriteLine("GetQueryExec Error: {0}", e.Message);
                    }
                } while (q.Status.State == "RUNNING" || q.Status.State == "QUEUED");

                Console.WriteLine("Data Scanned for {0}: {1} Bytes", id, q.Statistics.DataScannedInBytes);


                GetQueryResultsRequest resReq = new GetQueryResultsRequest()
                {
                    QueryExecutionId = id,
                    MaxResults       = 10
                };

                GetQueryResultsResponse resResp = null;

                do
                {
                    resResp = await client.GetQueryResultsAsync(resReq);

                    foreach (Row row in resResp.ResultSet.Rows)
                    {
                        Dictionary <String, String> dict = new Dictionary <String, String>();
                        for (var i = 0; i < resResp.ResultSet.ResultSetMetadata.ColumnInfo.Count; i++)
                        {
                            dict.Add(resResp.ResultSet.ResultSetMetadata.ColumnInfo[i].Name, row.Data[i].VarCharValue);
                        }
                        items.Add(dict);
                    }

                    if (resResp.NextToken != null)
                    {
                        resReq.NextToken = resResp.NextToken;
                    }
                } while (resResp.NextToken != null);


                return(items);
            }

            var response = new APIGatewayProxyResponse
            {
                StatusCode = (int)HttpStatusCode.OK,
                Body       = "GET Method Executed",
                Headers    = new Dictionary <string,
                                             string> {
                    { "Content-Type", "application/json" }
                }
            };

            return(response);
        }
Beispiel #18
0
        async static Task <List <Dictionary <String, String> > > getQueryExecution(IAmazonAthena client, String id)
        {
            List <Dictionary <String, String> > items   = new List <Dictionary <String, String> >();
            GetQueryExecutionResponse           results = null;
            QueryExecution q = null;
            /* Declare query execution request object */
            GetQueryExecutionRequest qReq = new GetQueryExecutionRequest()
            {
                QueryExecutionId = id
            };

            /* Poll API to determine when the query completed */
            do
            {
                List <Dictionary <string, string> > lists = new List <Dictionary <string, string> >();
                try
                {
                    results = await client.GetQueryExecutionAsync(qReq);

                    if (results == null)
                    {
                        Dictionary <string, string> dic1 = new Dictionary <string, string>();
                        dic1.Add("error", "results is null");
                        lists.Add(dic1);
                        return(lists);
                    }

                    q = results.QueryExecution;

                    if (q == null)
                    {
                        Dictionary <string, string> dic3 = new Dictionary <string, string>();
                        dic3.Add("error", "q is null");
                        lists.Add(dic3);
                        return(lists);
                    }

                    Console.WriteLine("Status: {0}... {1}", q.Status.State, q.Status.StateChangeReason);

                    await Task.Delay(5000); //Wait for 5sec before polling again
                }
                catch (InvalidRequestException e)
                {
                    Dictionary <string, string> dic2 = new Dictionary <string, string>();
                    dic2.Add("error", "exception : " + " (Run method) " + " : " + e.Message);
                    lists.Add(dic2);
                    Console.WriteLine("GetQueryExec Error: {0}", e.Message);

                    return(lists);
                }
            } while (q.Status.State == "RUNNING" || q.Status.State == "QUEUED");

            Console.WriteLine("Data Scanned for {0}: {1} Bytes", id, q.Statistics.DataScannedInBytes);

            /* Declare query results request object */
            GetQueryResultsRequest resReq = new GetQueryResultsRequest()
            {
                QueryExecutionId = id,
                MaxResults       = 20
            };

            GetQueryResultsResponse resResp = null;
            /* Page through results and request additional pages if available */
            Dictionary <String, String>         dic = new Dictionary <String, String>();
            List <Dictionary <String, String> > l   = new List <Dictionary <String, String> >();

            do
            {
                resResp = await client.GetQueryResultsAsync(resReq);


                //l.Add(dict);

                /* Loop over result set and create a dictionary with column name for key and data for value */
                foreach (Row row in resResp.ResultSet.Rows)
                {
                    Dictionary <String, String> dict = new Dictionary <String, String>();
                    for (var i = 0; i < resResp.ResultSet.ResultSetMetadata.ColumnInfo.Count; i++)
                    {
                        dict.Add(resResp.ResultSet.ResultSetMetadata.ColumnInfo[i].Name, row.Data[i].VarCharValue);
                    }
                    items.Add(dict);
                }

                if (resResp.NextToken != null)
                {
                    resReq.NextToken = resResp.NextToken;
                }
            } while (resResp.NextToken != null);
            if (items == null)
            {
                dic.Add("error", "items are null here");
                l.Add(dic);
                return(l);
            }
            /* Return List of dictionary per row containing column name and value */
            return(items);
        }