I tried your example and found the same exception on direct runner. I think MAP with Row as value types is not well supported in SQL so file https://jira.apache.org/jira/browse/BEAM-7623 to improve it.
-Rui On Mon, Jun 24, 2019 at 4:41 AM Vishwas Bm <bmvish...@gmail.com> wrote: > Hi Rui, > > I was trying out a use case where we have a map with key as string and > value as Row. When we try to access the primitive field in the Row we are > getting below exception. > > Caused by: java.lang.NoSuchFieldException: color > at java.lang.Class.getDeclaredField(Class.java:2070) > at > org.apache.beam.repackaged.beam_sdks_java_extensions_sql.org.apache.calcite.runtime.SqlFunctions.structAccess(SqlFunctions.java:2405) > > Below is the schema and the sql query used: > > Schema primitiveFieldsScema = > Schema.builder().addStringField("color").build(); > Schema inputSchema = > Schema.builder().addMapField("mapWithValueAsRow", FieldType.STRING, > FieldType.row(primitiveFieldsScema)).build(); > Map<String, Row> mapWithValueAsRow = new HashMap<>(); > Row row = > Row.withSchema(primitiveFieldsScema).addValue("RED").build(); > mapWithValueAsRow.put("key", row); > > Row rowOfMap = > Row.withSchema(inputSchema).addValue(mapWithValueAsRow).build(); > > Query used: > > * select PCOLLECTION.mapWithValueAsRow['key'].color as > color from PCOLLECTION* > > > In git there are scenario > <https://github.com/apache/beam/blob/master/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/BeamSqlMapTest.java> > of accessing map using select query. But in those values are all of > primitive types. In my case the value is of type Row. > So can you let me know whether this is supported or this is a bug ? > > > *Thanks & Regards,* > > *Vishwas * > > > On Thu, Jun 20, 2019 at 11:25 PM Rui Wang <ruw...@google.com> wrote: > >> Oops I made a mistake, I didn't work on[1] but actually [2] >> >> [1]: >> https://github.com/apache/beam/blob/master/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/BeamSqlDslNestedRowsTest.java >> [2]: >> https://github.com/apache/beam/blob/master/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/BeamComplexTypeTest.java >> >> -Rui >> >> On Thu, Jun 20, 2019 at 9:58 AM Rui Wang <ruw...@google.com> wrote: >> >>> I wrote some tests on nested row selection in BeamSQL[1]. Those test >>> cases test some behaviors of nested row selection that BeamSQL supports(but >>> it's not a complete list). >>> >>> You could check what are tested so that are supported. Also it's welcome >>> to extend those tests to cover more behaviors. >>> >>> >>> [1]: >>> https://github.com/apache/beam/blob/master/sdks/java/extensions/sql/src/test/java/org/apache/beam/sdk/extensions/sql/BeamSqlDslNestedRowsTest.java >>> >>> >>> -Rui >>> >>> On Thu, Jun 20, 2019 at 4:25 AM Andrew Pilloud <apill...@google.com> >>> wrote: >>> >>>> Hi Alex, >>>> >>>> Unfortunately you are receiving an UnsupportedOperationException >>>> because selecting nested rows is not supported by Calcite. You select >>>> fields out of the nested row but not a row itself. There are some recent >>>> bug fixes in this area in Calcite 1.20, so it might be worth trying that. >>>> There has been a lot of work on this area in Calcite in the past year so it >>>> is also possible the work that remains is in Beam. We have a bug open on >>>> the issue in Beam: https://issues.apache.org/jira/browse/BEAM-5189 >>>> >>>> Beam is repackaging Calcite by copying and relocating the code using >>>> the gradle relocate rule. The code is unchanged, but >>>> 'org.apache.beam.repackaged.beam_sdks_java_extensions_sql' is added to the >>>> class path so it won't conflict with Calcite in use by some of the Beam >>>> runners. If you want to change the version to a local snapshot of calcite >>>> for development you can modify it here: >>>> https://github.com/apache/beam/blob/master/sdks/java/extensions/sql/build.gradle#L72 >>>> >>>> Andrew >>>> >>>> On Thu, Jun 20, 2019 at 3:02 AM alex goos <ag...@mac.com> wrote: >>>> >>>>> Beam 2.13, I'm trying to do SqlTransform on Row records with >>>>> hierarchical structures. Records having (nullable) arrays of (nullabke) >>>>> sub-records: >>>>> >>>>> "select p.recordType, p.listOfServiceData.seqOf[0].ratingGroup as >>>>> ratingGroup, p.abcdAddress.seqOf[0] as ABCD_IP FROM PCOLLECTION " >>>>> >>>>> The code resposible for the Error when accessing subsctructures seems >>>>> to come from a repackaged Calcite Library: Where do I start asking >>>>> around/fixing the issue ?! Here? at the Apache Calcite mailing list? How >>>>> is >>>>> Beam "repackageing" Calcite-core ? Manually,by importing code ?! >>>>> >>>>> Exception in thread "main" java.lang.UnsupportedOperationException: >>>>> class >>>>> org.apache.beam.repackaged.beam_sdks_java_extensions_sql.org.apache.calcite.rex.RexFieldAccess: >>>>> ITEM($28.seqOf, 0).ratingGroup >>>>> at >>>>> org.apache.beam.repackaged.beam_sdks_java_extensions_sql.org.apache.calcite.util.Util.needToImplement(Util.java:955) >>>>> at >>>>> org.apache.beam.repackaged.beam_sdks_java_extensions_sql.org.apache.calcite.sql2rel.RelStructuredTypeFlattener.flattenProjection(RelStructuredTypeFlattener.java:662) >>>>> at >>>>> org.apache.beam.repackaged.beam_sdks_java_extensions_sql.org.apache.calcite.sql2rel.RelStructuredTypeFlattener.flattenProjections(RelStructuredTypeFlattener.java:587) >>>>> at >>>>> org.apache.beam.repackaged.beam_sdks_java_extensions_sql.org.apache.calcite.sql2rel.RelStructuredTypeFlattener.rewriteRel(RelStructuredTypeFlattener.java:501) >>>>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) >>>>> at >>>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) >>>>> at >>>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) >>>>> at java.lang.reflect.Method.invoke(Method.java:498) >>>>> at >>>>> org.apache.beam.repackaged.beam_sdks_java_extensions_sql.org.apache.calcite.util.ReflectUtil.invokeVisitorInternal(ReflectUtil.java:257) >>>>> at >>>>> org.apache.beam.repackaged.beam_sdks_java_extensions_sql.org.apache.calcite.util.ReflectUtil.invokeVisitor(ReflectUtil.java:214) >>>>> at >>>>> org.apache.beam.repackaged.beam_sdks_java_extensions_sql.org.apache.calcite.util.ReflectUtil$1.invokeVisitor(ReflectUtil.java:464) >>>>> at >>>>> org.apache.beam.repackaged.beam_sdks_java_extensions_sql.org.apache.calcite.sql2rel.RelStructuredTypeFlattener$RewriteRelVisitor.visit(RelStructuredTypeFlattener.java:768) >>>>> at >>>>> org.apache.beam.repackaged.beam_sdks_java_extensions_sql.org.apache.calcite.sql2rel.RelStructuredTypeFlattener.rewrite(RelStructuredTypeFlattener.java:195) >>>>> at >>>>> org.apache.beam.repackaged.beam_sdks_java_extensions_sql.org.apache.calcite.sql2rel.SqlToRelConverter.flattenTypes(SqlToRelConverter.java:468) >>>>> at >>>>> org.apache.beam.repackaged.beam_sdks_java_extensions_sql.org.apache.calcite.prepare.PlannerImpl.rel(PlannerImpl.java:236) >>>>> at >>>>> org.apache.beam.sdk.extensions.sql.impl.CalciteQueryPlanner.convertToBeamRel(CalciteQueryPlanner.java:129) >>>>> at >>>>> org.apache.beam.sdk.extensions.sql.impl.BeamSqlEnv.parseQuery(BeamSqlEnv.java:87) >>>>> at >>>>> org.apache.beam.sdk.extensions.sql.SqlTransform.expand(SqlTransform.java:122) >>>>> at >>>>> org.apache.beam.sdk.extensions.sql.SqlTransform.expand(SqlTransform.java:82) >>>>> at org.apache.beam.sdk.Pipeline.applyInternal(Pipeline.java:537) >>>>> at org.apache.beam.sdk.Pipeline.applyTransform(Pipeline.java:471) >>>>> >>>>> Many thanks! >>>>> >>>>