小编jrj*_*rjd的帖子

如何在不返回Elasticsearch中的所有存储区的情况下执行管道聚合

我正在使用Elasticsearch 2.3,我正在尝试使用管道聚合执行两步计算.我只对管道聚合的最终结果感兴趣,但Elasticsearch返回所有桶信息.

由于我有大量的桶(数十或数亿),这是令人望而却步的.不幸的是,我找不到告诉Es不要返回所有这些信息的方法.

这是一个玩具的例子.我有test-index一个文档类型的索引obj.obj有两个字段,keyvalues.

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)

elasticsearch elasticsearch-aggregation

9
推荐指数
1
解决办法
2927
查看次数

将镶木地板文件加载到Spark中的case类的性能

我正在评估在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)

scala apache-spark parquet apache-spark-sql

7
推荐指数
1
解决办法
1157
查看次数

在Scala中处理高级对象时,类型信息会丢失

我试图分解一些代码,最终不得不使用更高级的类型.以下最小示例正常工作:

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)

scala type-inference higher-kinded-types

6
推荐指数
1
解决办法
87
查看次数