trino icon indicating copy to clipboard operation
trino copied to clipboard

[Pinot connector] Support for the Pinot `map_value` function

Open jpohanka opened this issue 2 years ago • 3 comments

Trino version: 389

Description:

Let's assume that we have a Pinot table tab and in this table, we have the following columns:

  • array_col_keys - array-type column, representing keys of a map
  • array_col_values - array-type column, representing values of a map

Pinot, for the specified version, does not implement a map type, thus a workaround has been implemented to allow some map-type functionality via the map_value function. This workaround assumes that we have two array columns in a Pinot table - a keys column and a values column.

If we want to fetch the values for a given key some_key via Pinot, we can do it in the following way via the map_value function:

SELECT
  map_value(array_col_keys, 'some_key', array_col_values) AS vals
FROM
 tab

The following is the same Pinot query as a passthrough query in Trino:

SELECT
  *
FROM
  pinot.default."
    SELECT
      map_value(array_col_keys, 'some_key', array_col_values) AS vals
    FROM
      tab
  "

The first query runs currently in Pinot, while the second query throws the following error:

Caught exception while initializing transform function: mapvalue

jpohanka avatar Jul 25 '22 19:07 jpohanka

In trino, there is a map_values function which returns the values of the map. I think you're looking for element_at in trino, something like select element_at(map(array_col_keys, array_col_values), 'some_key') from ...

elonazoulay avatar Aug 09 '22 01:08 elonazoulay

I see the issue with map_value - the key column has to be dictionary encoded, the connector needs to get this information from Pinot. Will update w fix.

elonazoulay avatar Aug 09 '22 08:08 elonazoulay

@elonazoulay Thank you for your help!

jpohanka avatar Aug 09 '22 12:08 jpohanka