现在Spark正在进行中.Spark使用scala语言来加载和执行程序以及python和java.RDD用于存储数据.但是,我无法理解Spark的架构,它是如何在内部运行的.
请告诉我Spark Architecture以及它如何在内部工作?
我有一个数据框有两列(C,D)被定义为字符串列类型,但列中的数据实际上是日期.例如,列C的日期为"01-APR-2015",列D的日期为"20150401"我想更改这些日期列类型,但我没有找到一个好方法.我看一下我需要在Spark SQL的DataFrame中将字符串列类型转换为Date列类型的堆栈溢出.日期格式可以是"01-APR-2015",我查看这篇文章,但它没有与日期相关的信息
我想转换数据框的模式以使用 Spark 和 Scala 更改某些列的类型。
具体来说,我试图使用 as[U] 函数,其描述为:“返回一个新的数据集,其中每个记录都已映射到指定的类型。用于映射列的方法取决于 U 的类型”
原则上这正是我想要的,但我无法让它工作。
这是一个来自https://github.com/apache/spark/blob/master/sql/core/src/test/scala/org/apache/spark/sql/DatasetSuite.scala的简单示例
// definition of data
val data = Seq(("a", 1), ("b", 2)).toDF("a", "b")
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,数据模式是:
根
|-- a: 字符串 (nullable = true)
|-- b:整数(可为空 = false)
我想将列“b”转换为 Double。所以我尝试以下操作:
import session.implicits._;
println(" --------------------------- Casting using (String Double)")
val data_TupleCast=data.as[(String, Double)]
data_TupleCast.show()
data_TupleCast.printSchema()
println(" --------------------------- Casting using ClassData_Double")
case class ClassData_Double(a: String, b: Double)
val data_ClassCast= data.as[ClassData_Double]
data_ClassCast.show()
data_ClassCast.printSchema()
Run Code Online (Sandbox Code Playgroud)
据我了解 as[u] 的定义,新的 DataFrame 应具有以下架构
根
|-- a: 字符串 … 由于VectorAssembler崩溃,如果传递的列具有除NumericTypeor 之外的任何其他类型BooleanType并且我正在处理许多TimestampType列,我想知道:
有一种简单的方法,一次投下多个列吗?
根据这个答案,我已经有了一个方便的方法来构建一个列:
def castColumnTo(df: DataFrame,
columnName: String,
targetType: DataType ) : DataFrame = {
df.withColumn( columnName, df(columnName).cast(targetType) )
}
Run Code Online (Sandbox Code Playgroud)
我想过castColumnTo递归调用,但我强烈怀疑这是(高效)的方式.
我有一个csv文件[1],我想直接加载到数据集中.问题是我总是得到错误
org.apache.spark.sql.AnalysisException: Cannot up cast `probability` from string to float as it may truncate
The type path of the target object is:
- field (class: "scala.Float", name: "probability")
- root class: "TFPredictionFormat"
You can either add an explicit cast to the input data or choose a higher precision type of the field in the target object;
Run Code Online (Sandbox Code Playgroud)
而且,特别是对于该phrases领域(检查案例类[2]),它得到了
org.apache.spark.sql.AnalysisException: cannot resolve '`phrases`' due to data type mismatch: cannot cast StringType to ArrayType(StringType,true);
Run Code Online (Sandbox Code Playgroud)
如果我将我的case类[2]中的所有字段定义为String类型,那么一切正常,但这不是我想要的.有没有一种简单的方法可以做到[3]?
参考
[1]一个示例行
B017NX63A2,Merrell,"['merrell_for_men', 'merrell_mens_shoes', 'merrel']",merrell_shoes,0.0806054356579781
Run Code Online (Sandbox Code Playgroud)
[2]我的代码片段如下 …
我在 Scala 中有一个列名列表,例如
var cols = List("col1", "col2", "col3","col4")
Run Code Online (Sandbox Code Playgroud)
我还有一个包含这些列的数据框,但都是字符串。现在我想通过遍历数据框的列表或列来转换数据框的列,因为我的列列表非常大,我无法使用这么多.withColumn参数
提前致谢
val inputfile = sqlContext.read
.format("com.databricks.spark.csv")
.option("header", "true")
.option("inferSchema", "true")
.option("delimiter", "\t")
.load("data")
inputfile: org.apache.spark.sql.DataFrame = [a: string, b: bigint, c: boolean]
val outputfile = inputfile.groupBy($"a",$"b").max($"c")
Run Code Online (Sandbox Code Playgroud)
上面的代码失败,因为它c是一个布尔变量,并且聚合不能应用于布尔值。是否有火花功能转换true价值来1并false给0了星火数据帧的整列。
我尝试了以下操作(源:如何在Spark SQL的DataFrame中更改列类型?)
val inputfile = sqlContext.read
.format("com.databricks.spark.csv")
.option("header", "true")
.option("inferSchema", "true")
.option("delimiter", "\t")
.load("data")
val tempfile =inputfile.select("a","b","c").withColumn("c",toInt(inputfile("c")))
val outputfile = tempfile.groupBy($"a",$"b").max($"c")
Run Code Online (Sandbox Code Playgroud)
以下问题:为PySpark在DataFrame中从布尔值转换为整数答案的新派生列,但我想要一个专门用于Scala的函数。
感谢任何帮助。