我尝试了两种方法从镶木地板中找到不同的行,但它似乎不起作用。
尝试1: Dataset<Row> df = sqlContext.read().parquet("location.parquet").distinct();
但是抛出
Cannot have map type columns in DataFrame which calls set operations
(intersect, except, etc.),
but the type of column canvasHashes is map<string,string>;;
尝试 2: 尝试运行 sql 查询:
Dataset<Row> df = sqlContext.read().parquet("location.parquet");
rawLandingDS.createOrReplaceTempView("df");
Dataset<Row> landingDF = sqlContext.sql("SELECT distinct on timestamp * from df");
我得到的错误:
= SQL ==
SELECT distinct on timestamp * from df
-----------------------------^^^
有没有办法在读取镶木地板文件时获得不同的记录?我可以使用的任何读取选项。
原文由 Himanshu Yadav 发布,翻译遵循 CC BY-SA 4.0 许可协议
您面临的问题在异常消息中明确说明 - 因为
MapType
列既不可散列也不可排序,不能用作分组或分区表达式的一部分。您对 SQL 解决方案的看法在逻辑上不等同于
distinct
上的Dataset
。如果您想基于一组兼容列删除重复数据,您应该使用dropDuplicates
:这相当于
不幸的是,如果您的目标是实际的
DISTINCT
这不会那么容易。可能的解决方案是利用 Scala*Map
散列。您可以像这样定义 Scalaudf
:然后在您的 Java 代码中使用它来派生可用于
dropDuplicates
的列:与 SQL 等效
\* 请注意
java.util.Map
和它的hashCode
将不起作用,因为hashCode
不一致。