我正在使用Elasticsearch 2.3,我正在尝试使用管道聚合执行两步计算.我只对管道聚合的最终结果感兴趣,但Elasticsearch返回所有桶信息.
由于我有大量的桶(数十或数亿),这是令人望而却步的.不幸的是,我找不到告诉Es不要返回所有这些信息的方法.
这是一个玩具的例子.我有test-index一个文档类型的索引obj.obj有两个字段,key和values.
curl -XPOST 'http://10.10.0.7:9200/test-index/obj' -d '{
"value": 100,
"key": "foo"
}'
curl -XPOST 'http://10.10.0.7:9200/test-index/obj' -d '{
"value": 20,
"key": "foo"
}'
curl -XPOST 'http://10.10.0.7:9200/test-index/obj' -d '{
"value": 50,
"key": "bar"
}'
curl -XPOST 'http://10.10.0.7:9200/test-index/obj' -d '{
"value": 60,
"key": "bar"
}'
curl -XPOST 'http://10.10.0.7:9200/test-index/obj' -d '{
"value": 70,
"key": "bar"
}'
Run Code Online (Sandbox Code Playgroud)
我想得到具有相同s 的s key的最小值的平均值(在所有s上).平均最小值.valueobjkey
Elasticsearch允许我这样做:
curl -XPOST 'http://10.10.0.7:9200/test-index/obj/_search' -d '{
"size": 0,
"query": …Run Code Online (Sandbox Code Playgroud) 我正在评估在Spark中加载Parquet文件的不同方法的性能,差异是惊人的.
在我们的Parquet文件中,我们有类似的嵌套case类:
case class C(/* a dozen of attributes*/)
case class B(/* a dozen of attributes*/, cs: Seq[C])
case class A(/* a dozen of attributes*/, bs: Seq[B])
Run Code Online (Sandbox Code Playgroud)
从Parquet文件加载它们需要一段时间.所以我已经完成了从Parquet文件加载案例类的不同方法的基准,并使用Spark 1.6和2.0对一个字段求和.
以下是我做的基准测试的总结:
val df: DataFrame = sqlContext.read.parquet("path/to/file.gz.parquet").persist()
df.count()
// Spark 1.6
// Play Json
// 63.169s
df.toJSON.flatMap(s => Try(Json.parse(s).as[A]).toOption)
.map(_.fieldToSum).sum()
// Direct access to field using Spark Row
// 2.811s
df.map(row => row.getAs[Long]("fieldToSum")).sum()
// Some small library we developed that access fields using Spark Row
// 10.401s
df.toRDD[A].map(_.fieldToSum).sum()
// Dataframe hybrid SQL …Run Code Online (Sandbox Code Playgroud) 我试图分解一些代码,最终不得不使用更高级的类型.以下最小示例正常工作:
trait Builder[M[_]] {
def build[A]: M[A]
def buildPair[A, B]: (M[A], M[B]) = (build[A], build[B])
}
class List[A]
class BuilderList extends Builder[List] {
def build[A] = new List[A]
}
val l: List[String] = (new BuilderList).build[String]
val ll: (List[String], List[Double]) = (new BuilderList).buildPair[String, Double]
defined trait Builder
defined class List
defined class BuilderList
l: List[String] = List@5c7754a7
ll: (List[String], List[Double]) = (List@62874648,List@7b0f6537)
Run Code Online (Sandbox Code Playgroud)
如果我现在想将它应用于具有两个类型参数的类型,比如说
class Map[K, V]
Run Code Online (Sandbox Code Playgroud)
我想能写
trait BuilderMap[K] extends Builder[Map[K, _]] {...}
Run Code Online (Sandbox Code Playgroud)
但当然这不起作用,因为Scala中的类型参数不是咖喱.
我发现以下技巧允许我通过编译:
trait PartialApplier[F[_, _], K] {
type …Run Code Online (Sandbox Code Playgroud)