我喜欢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
我正在构建一个矩阵库,我正在尝试使用基于策略的设计.所以我的基类是提供存储方法和一些访问功能的类.我还有一个提供数学函数的函数矩阵.这很好用,但由于返回类型,运算符*存在一个主要问题.我将用一些代码解释它.
提供堆栈存储的基类:
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) 我想对模板类使用部分特化,以便该模板类的所有子节点都将使用该特化.让我用一个例子来解释:)
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) 我想创建一个应该与案例类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) c++ ×2
scala ×2
templates ×2
apache-spark ×1
c++11 ×1
case-class ×1
generics ×1
join ×1
traits ×1