I've been able to execute limit clauses in the lingual shell and those work. Things like:
select t.BAR from MDP.MYTABLE t LIMIT 1But when I try it in Lingual (using Cascading flows), it fails.
Am I doing something wrong or are LIMIT clauses not allowed? Is there another way to get this to work? I don't need this often, but I have a particular use case where it would be very helpful to get this working. I am able to do it in Hive, for example.
Here's the code:
String sql = "select t.BAR from \"MDP\".\"MYTABLE\" t LIMIT 1";
final String[] mytabCols = new String[] {"FOO","BAR","BAZ","QUX"};
final Type[] mytabTypes = new Type[] {String.class, String.class, String.class, String.class};
Fields mytabFields = new Fields(mytabCols, mytabTypes);
SQLTypedTextDelimited mytabScheme = new SQLTypedTextDelimited(mytabFields, "|", "\"",
false, /*header*/
true, /*strict*/
true); /*safe*/
Tap<?,?,?> mytabTap = new FileTap(mytabScheme, "mdp/mytable", SinkMode.KEEP);
Tap<?,?,?> resultsTap = new FileTap(new TextDelimited(false, ",", "\""), "mdp/myoutput", SinkMode.REPLACE);
SQLPlanner sqlPlanner = new SQLPlanner().setSql(sql);
FlowDef flowDef = FlowDef.flowDef()
.setName("myquery")
.addSource("MDP.MYTABLE", mytabTap)
.addSink("myoutput", resultsTap)
.addAssemblyPlanner(sqlPlanner);
Flow<?> flow = new LocalFlowConnector().connect(flowDef);
flow.complete();(this example uses local mode, but I get the same error in Hadoop mode)
and here's the error:
2014-02-27 10:57:34,137 INFO [main] property.AppProps (AppProps.java:getAppID(162)) - using app.id: AF620CE2915A453CAC512E0CE2FC1422
2014-02-27 10:57:34,231 INFO [main] tap.TapSchema (TapSchema.java:addTapTableFor(125)) - adding table on schema: MDP, table: MYTABLE, fields: 'FOO', 'BAR', 'BAZ', 'QUX' | String, String, String, String, identifier: mdp/mytable
2014-02-27 10:57:34,233 INFO [main] tap.TapSchema (TapSchema.java:addTapTableFor(125)) - adding table on schema: null, table: myoutput, fields: UNKNOWN, identifier: mdp/myoutput
Exception in thread "main" cascading.flow.planner.PlannerException: could not build flow from assembly: [net.hydromatic.linq4j.EnumerableDefaults$12 cannot be cast to cascading.lingual.optiq.enumerable.CascadingFlowRunnerEnumerable]
at cascading.flow.planner.FlowPlanner.handleExceptionDuringPlanning(FlowPlanner.java:576)
at cascading.flow.local.planner.LocalPlanner.buildFlow(LocalPlanner.java:108)
at cascading.flow.local.planner.LocalPlanner.buildFlow(LocalPlanner.java:40)
at cascading.flow.FlowConnector.connect(FlowConnector.java:459)
at com.truven.di.Stage2Joins.limit(Stage2Joins.java:69)
at com.truven.di.Stage2Joins.main(Stage2Joins.java:37)
Caused by: java.lang.ClassCastException: net.hydromatic.linq4j.EnumerableDefaults$12 cannot be cast to cascading.lingual.optiq.enumerable.CascadingFlowRunnerEnumerable
at cascading.lingual.flow.SQLPlanner.resolveTails(SQLPlanner.java:113)
at cascading.flow.planner.FlowPlanner.resolveAssemblyPlanners(FlowPlanner.java:150)
at cascading.flow.planner.FlowPlanner.resolveTails(FlowPlanner.java:137)
at cascading.flow.local.planner.LocalPlanner.buildFlow(LocalPlanner.java:81)
... 4 more