dplyr过滤函数源代码,我无法得到,当我点击filter()时,源代码是UseMethod(),当我调试时,什么都没有出现;
我的测试代码:
过滤器(鸢尾花,萼片长度>7.1)
所以我尝试编写自己的函数
第一个版本:
filter<-function(data,condition){
attach(data)
r<- data[which(condition,)]
detach(data)
return (r)
}
Run Code Online (Sandbox Code Playgroud)
它有效,当我使用 system.time() 比较 dplyr:filter 和 mine:filter 时,我的松散,比 dplyr 花费更多的时间;
第二个版本:
filter<-function(data,condition){
r<-with(data,data[which(condition),])
return (r)
}
Run Code Online (Sandbox Code Playgroud)
它报告错误,未找到 Sepal.Length。
我知道是条件参数的问题,
如果我直接使用 with(irirs,irirs[which(Sepal.Length>7.1),]) ,它可以工作,但我需要一个自己的过滤器功能
我有两个问题:
多谢!
我发现我的业务代码中有一些非法数据,经过调试,我发现这个错误是由spark分区解析引起的,我应该如何做才能避免这个问题而不更改写入分区列。
\nimport org.apache.spark.sql.functions.lit\nimport spark.implicits._\n\nval df = Seq(("122D", 2), ("122F", 2), ("122", 2))\n .toDF("no", "value")\n .withColumn("other", lit(1))\n\nval path = "/user/my/output"\n\ndf\n .write\n .partitionBy("no","value")\n .parquet(path)\nRun Code Online (Sandbox Code Playgroud)\n我的预期结果是读为 aame 为 write
\ndf.show()\n+----+-----+-----+\n| no|value|other|\n+----+-----+-----+\n|122D| 2| 1|\n|122F| 2| 1|\n| 122| 2| 1|\n+----+-----+-----+\n\n// df.distinct.count==3\nRun Code Online (Sandbox Code Playgroud)\n实际读取结果是这样的
\nval read=spark.read.parquet(path)\n\nread.show()\n+-----+-----+-----+\n|other| no|value|\n+-----+-----+-----+\n| 1|122.0| 2|\n| 1|122.0| 2|\n| 1|122.0| 2|\n+-----+-----+-----+\n\n// read.distinct.count==1\n\nRun Code Online (Sandbox Code Playgroud)\n检查output目录结构是这样的
\xe2\x94\x94\xe2\x94\x80output\n \xe2\x94\x9c\xe2\x94\x80no=122\n \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80value=2\n \xe2\x94\x9c\xe2\x94\x80no=122D\n \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80value=2\n \xe2\x94\x94\xe2\x94\x80no=122F\n \xe2\x94\x94\xe2\x94\x80value=2\nRun Code Online (Sandbox Code Playgroud)\n非常感谢。\n我的 Spark 版本是2.4.5,scala 版本是2.11.12