通常,组中的所有行都将传递给聚合函数.我想使用条件过滤行,以便只将组中的某些行传递给聚合函数.PostgreSQL可以实现这样的操作.我想用Spark SQL DataFrame(Spark 2.0.0)做同样的事情.
代码可能看起来像这样:
val df = ... // some data frame
df.groupBy("A").agg(
max("B").where("B").less(10), // there is no such method as `where` :(
max("C").where("C").less(5)
)
Run Code Online (Sandbox Code Playgroud)
所以对于像这样的数据框:
| A | B | C |
| 1| 14| 4|
| 1| 9| 3|
| 2| 5| 6|
Run Code Online (Sandbox Code Playgroud)
结果将是:
|A|max(B)|max(C)|
|1| 9| 4|
|2| 5| null|
Run Code Online (Sandbox Code Playgroud)
是否可以使用Spark SQL?
请注意,通常max可以使用任何其他聚合函数,并且在具有任意过滤条件的同一列上可能存在多个聚合.
给出以下可变参数模板:
template<typename... Params>
void fun(void(*f)(Params...), Params... params) {
f(params...);
}
int main() {
fun(+[](int a, int b) {}, 2, 3);
}
Run Code Online (Sandbox Code Playgroud)
现在,当fun使用lambda 调用时,我需要明确指定所有lambda参数的类型.这似乎是多余的,因为int, int可以从中推断出来2, 3.有没有办法让它更简洁自动?
我想以下工作,但它没有:
template<typename... Params>
void fun(void(*f)(Params...), Params... params) {
f(params...);
}
int main() {
fun(+[](auto a, auto b) {}, 2, 3);
}
Run Code Online (Sandbox Code Playgroud)
我正在编译g++ 5.4.0和-std=c++14.
我想连接几行,对它们执行正则表达式匹配并打印它们.我试着用sed做到这一点.
即,我用过:
cat add | sed -rn '/FIRST_LINE_REGEX/,/LAST_LINE_REGEX/s/SOME_REGEX/&/p'
Run Code Online (Sandbox Code Playgroud)
它只打印与SOME_REGEX匹配的行,而我希望它连接FIRST_LINE和LAST_LINE之间的行,并打印串联(如果它与SOME_REGEX匹配).
我想对一个集合进行分组,但我不希望聚合包含一些值.这样做的最佳解决方案是什么?
解决方案可能是收集器,filtering(Predicate,Collector)但没有这样的收集器.没有实现自己的收藏家,有没有办法做到这一点?
IntStream.range(0,100).collect(
groupingBy(
i -> i % 3,
HashMap::new,
filtering( i -> i % 2 == 0, toSet() )
)
);
Run Code Online (Sandbox Code Playgroud) 我知道一个函数的指针是8字节,因为虚拟化,但为什么指向函数指针的指针是8字节?
typedef void(*fun())();
sizeof(fun*); // returns 8 byte
Run Code Online (Sandbox Code Playgroud) 我想懒得找到所有已定义的枚举值名称的最大值.执行时下面的代码片段会反复进行无限循环打印InvocationTargetException.
object Enum extends Enumeration with App {
val A, B = new Val
lazy val foo = values.maxBy(_.toString)
println(Enum.foo)
}
Run Code Online (Sandbox Code Playgroud)
当该问题不会出现foo是一个def.
为什么它会像这样?不lazy val应该只是一个记忆def?
奇怪的是,下面的代码确实按预期工作:
object Enum extends Enumeration with App {
val A, B = new Val
lazy val foo = values.foldLeft(""){(a, b) => a + b}
println(Enum.foo)
}
Run Code Online (Sandbox Code Playgroud)
我正在使用scala 2.11.7.
// ---解决方案
问题是foo是Value类型的,因此被解释为枚举值.解决问题的方法是创建一个代理def,lazy val如下面的代码:
object Enum extends Enumeration with App {
val …Run Code Online (Sandbox Code Playgroud) 鉴于下面的代码,我想匹配第一次form出现.我发现负面前瞻?!可能用于实现这一目标,但它不起作用.我的正则表达式有什么问题?
#test
$test = "<form abc> foo </form> <form gg> bar </form>";
$test =~ m/<form[^>]*abc[^>]*>(?!.*form>.*)form>/s;
print $&;
Run Code Online (Sandbox Code Playgroud)