小编Spa*_*rky的帖子

使用Spark数据集在Scala中执行类型化连接

我喜欢Spark数据集,因为它们在编译时给我分析错误和语法错误,并且允许我使用getter而不是硬编码的名称/数字.大多数计算都可以使用Dataset的高级API完成.例如,通过访问数据集类型对象而不是使用RDD行的数据字段来执行agg,select,sum,avg,map,filter或groupBy操作要简单得多.

但是,由于缺少连接操作,我读到我可以像这样进行连接

ds1.joinWith(ds2, ds1.toDF().col("key") === ds2.toDF().col("key"), "inner")
Run Code Online (Sandbox Code Playgroud)

但这不是我想要的,因为我更喜欢通过case类接口来做,所以更像这样的东西

ds1.joinWith(ds2, ds1.key === ds2.key, "inner")
Run Code Online (Sandbox Code Playgroud)

现在最好的选择似乎是在case类旁边创建一个对象,并给这个函数提供正确的列名作为String.所以我会使用第一行代码但是放置一个函数而不是硬编码的列名.但那感觉不够优雅..

有人可以告诉我其他选项吗?目标是从实际的列名中抽象出来,最好通过case类的getter工作.

我正在使用Spark 1.6.1和Scala 2.10

scala join apache-spark apache-spark-sql apache-spark-dataset

28
推荐指数
1
解决办法
8694
查看次数

C++ 11模板,确定返回类型

我正在构建一个矩阵库,我正在尝试使用基于策略的设计.所以我的基类是提供存储方法和一些访问功能的类.我还有一个提供数学函数的函数矩阵.这很好用,但由于返回类型,运算符*存在一个主要问题.我将用一些代码解释它.

提供堆栈存储的基类:

template < typename T, unsigned int rows, unsigned int cols>
class denseStackMatrix {
public:
    typedef T value_type;

private:
    value_type grid[rows][cols];
    const unsigned int rowSize;
    const unsigned int colSize;
Run Code Online (Sandbox Code Playgroud)

然后我有我的矩阵类,它提供了数学功能:

template <typename MatrixContainer >
class matrix : public MatrixContainer {
public:
    typedef MatrixContainer Mcontainer;

    matrix<Mcontainer>& operator +(const matrix<Mcontainer>&);
    matrix<Mcontainer>& operator *(const matrix<Mcontainer>&);
Run Code Online (Sandbox Code Playgroud)

operator+总是有效,operator*只适用于方阵.所以我们仍然需要一个所有矩阵.这就是它出错了.我已经尝试了很少的东西,但没有尝试.我寻找这样的东西,在c ++ 0x的帮助下(c ++ 0x的使用不是必需的)你应该注意到"???" :)

friend auto operator * (const matrix<T1>& matrix1, const matrix<T2>& matrix2)
-> decltype(matrix<???>);
Run Code Online (Sandbox Code Playgroud)

问题的一个例子

matrix<denseStackMatrix<int,3,2> > matrix1; …
Run Code Online (Sandbox Code Playgroud)

c++ templates design-patterns policy-based-design c++11

14
推荐指数
1
解决办法
610
查看次数

多个类的父级的部分特化

我想对模板类使用部分特化,以便该模板类的所有子节点都将使用该特化.让我用一个例子来解释:)

template < typename T, unsigned int rows, unsigned int cols>
class BaseMatrix {...};
Run Code Online (Sandbox Code Playgroud)

这个类将有子项指定矩阵的结构,如稀疏,密集,对角线,..

template < typename T, unsigned int rows, unsigned int cols>
class DiagonalMatrix : public BaseMatrix<T,rows,cols>{..}
Run Code Online (Sandbox Code Playgroud)

然后这些类将再次生成指定存储的子节点:堆栈数组,向量,列表,队列,..

template < typename T, unsigned int rows, unsigned int cols>
class StackDiagonalMatrix : public DiagonalMatrix<T, rows, cols> {..}
Run Code Online (Sandbox Code Playgroud)

然后有一个类Matrix,它提供所有数学功能.这个模板类实现了operator +,operator-等......

   template <typename T, 
             template<typename, unsigned, unsigned> class MatrixContainer,
             unsigned Rows, 
             unsigned Cols>
    class matrix;
Run Code Online (Sandbox Code Playgroud)

对于这最后一堂课,我想写下这样的专业:

template <typename T,unsigned Rows, unsigned Cols>
class matrix<T, BaseMatrix, Rows, Cols> {};

template <typename …
Run Code Online (Sandbox Code Playgroud)

c++ templates policy-based-design

5
推荐指数
1
解决办法
541
查看次数

如何使用在Scala中创建数据集的通用案例类实现特征

我想创建一个应该与案例类T一起实现的Scala特征。该特征只是加载数据并将其转换为类型T的Spark数据集。我得到一个错误,即无法存储任何编码器,我认为这是因为Scala不知道T应该是案例类。我怎样才能告诉编译器呢?我见过某个地方应该提到Product,但是还没有定义此类。.随意建议其他方法!

我有以下代码,但未编译该错误:42:错误:找不到用于存储在数据集中的类型的编码器。通过导入sqlContext.implicits._ [INFO] .as [T],支持基本类型(Int,String等)和产品类型(案例类)。

我正在使用Spark 1.6.1

码:

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql.{Dataset, SQLContext}    

/**
      * A trait that moves data on Hadoop with Spark based on the location and the granularity of the data.
      */
    trait Agent[T] {
      /**
        * Load a Dataframe from the location and convert into a Dataset
        * @return Dataset[T]
        */
      protected def load(): Dataset[T] = {
        // Read in the data
        SparkContextKeeper.sqlContext.read
          .format("com.databricks.spark.csv")
          .load("/myfolder/" + location + "/2016/10/01/")
          .as[T]
      }
    }
Run Code Online (Sandbox Code Playgroud)

generics scala traits case-class apache-spark-sql

2
推荐指数
1
解决办法
1748
查看次数