为什么使用Spark Dataset.select替换列值

时间:2020-01-15 20:02:32

标签: apache-spark apache-spark-sql apache-spark-dataset

Dataset<Row> ds = .....
ds = ds.select("cola", "colb");
ds.show();

DS已正确加载。 DS包含多个列。我要选择“可乐”和“可乐”专栏。这些列确实存在,否则上面的代码将引发错误Caused by: org.apache.spark.sql.AnalysisException: cannot resolve colA given input columns。我的问题是它将值替换为列名。如何保留原始值?

expected 

cola | colb
1       2
3       4

我得到的东西

cola | colb
cola   colb 
cola   colb

1 个答案:

答案 0 :(得分:0)

从DB将数据加载到dataSet中时,请不要信任已正确加载数据,直到您看到实际的数据为止。

在这种情况下,我可以看到ds.printSchemads.count().show(),但是当我执行ds.select("cola", "colb")时却没有显示正确的数据。

现在有一些调查表明,从memSql加载时我不应该使用JDBC

我一直在关注错了。它可以加载架构,但不能加载实际数据。

 Dataset<Row> ds= spark.read()
                .format("jdbc")
                .option("user", getDbUser(true))
                .option("password", getDbPass(true))
                .option("url", h2RawPositions)
                .option("dbtable", h2PositionTableName)
                .load();

相反,我使用了com.memsql.spark.connector(Source)。

Dataset<Row> gsProducts = spark.read()
                .format("com.memsql.spark.connector")
                .option("url", memsqlConnection)
                .option("dbtable", mamsqlTableName) 
                .option("query", "select blah, blah frm memSqlTableName")
                .load();