我有以下结构的数据框:
root
|-- index: long (nullable = true)
|-- text: string (nullable = true)
|-- topicDistribution: struct (nullable = true)
| |-- type: long (nullable = true)
| |-- values: array (nullable = true)
| | |-- element: double (containsNull = true)
|-- wiki_index: string (nullable = true)
Run Code Online (Sandbox Code Playgroud)
我需要将其更改为:
root
|-- index: long (nullable = true)
|-- text: string (nullable = true)
|-- topicDistribution: array (nullable = true)
| |-- element: double (containsNull = true)
|-- wiki_index: string (nullable = …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Java API从DataFrame中选择列列表.
示例Java代码:
List<String> colList = Arrays.asList(new String[] { "column1", "column2", "column3" });
df.selectExpr((String[])colList.toArray()).show();
Run Code Online (Sandbox Code Playgroud)
在Java API中,我必须使用selectExpr而不是select.有没有其他方法可以使用Java API选择列列表.
但是在Scala中,我可以做类似下面的事情.
示例Scala代码:
val colList = List("column1", "column2", "column3")
df.select(colList.head, colList.tail: _*).show
Run Code Online (Sandbox Code Playgroud) 我一直在探索Spark SQL中的全阶段代码生成优化(又称全阶段codegen),并且想知道"while-stage"中的"阶段"是多少来自Spark Core的一个阶段(Spark工作)的含义?
Spark SQL和Spark Core中的整个阶段代码阶段之间是否存在任何技术关系?或者它们是否更广泛地用于指计算中的"阶段"?
我在poc工作,我需要创建数据帧,然后将其保存为ctrl一个分隔文件.我创建中间结果的查询如下
val grouped = results.groupBy("club_data","student_id_add","student_id").agg(sum(results("amount").cast(IntegerType)).as("amount"),count("amount").as("cnt")).filter((length(trim($"student_id")) > 1) && ($"student_id").isNotNull)
Run Code Online (Sandbox Code Playgroud)
将结果保存在文本文件中
grouped.select($"club_data", $"student_id_add", $"amount",$"cnt").rdd.saveAsTextFile("/amit/spark/output4/")
Run Code Online (Sandbox Code Playgroud)
输出:
[amit,DI^A356035,581,1]
Run Code Online (Sandbox Code Playgroud)
它以逗号分隔保存数据,但我需要将其保存为ctrl-A单独的I尝试选项("分隔符","\ u0001")但似乎不受dataframe/rdd支持.
有什么功能有帮助吗?
我RDD[Long]打电话mod,我想使用Spark 2.2和Scala 2.11.8计算此RDD的标准偏差和平均值.
我该怎么做?
我尝试按如下方式计算平均值,但有没有更简单的方法来获取这些值?
val avg_val = mod.toDF("col").agg(
avg($"col").as("avg")
).first().toString().toDouble
val stddev_val = mod.toDF("col").agg(
stddev($"col").as("avg")
).first().toString().toDouble
Run Code Online (Sandbox Code Playgroud) 我有两个DataFrames推荐和电影.建议中的列rec1-rec3表示电影数据帧中的电影ID.
val recommendations: DataFrame = List(
(0, 1, 2, 3),
(1, 2, 3, 4),
(2, 1, 3, 4)).toDF("id", "rec1", "rec2", "rec3")
val movies = List(
(1, "the Lord of the Rings"),
(2, "Star Wars"),
(3, "Star Trek"),
(4, "Pulp Fiction")).toDF("id", "name")
Run Code Online (Sandbox Code Playgroud)
我想要的是:
+---+------------------------+------------+------------+
| id| rec1| rec2| rec3|
+---+------------------------+------------+------------+
| 0| the Lord of the Rings| Star Wars| Star Trek|
| 1| Star Wars| Star Trek|Pulp Fiction|
| 2| the Lord of the Rings| Star Trek| Star Trek|
+---+------------------------+------------+------------+
Run Code Online (Sandbox Code Playgroud) 我想用三个输入参数编写通用方法:
因此,我的想法是编写这样的方法:
def load_sms_ds(filePath: String, schemaInfo: ?, cc: ?) = {
val ds = spark.read
.format("csv")
.option("header", "true")
.schema(?)
.option("delimiter",",")
.option("dateFormat", "yyyy-MM-dd HH:mm:ss.SSS")
.load(schemaInfo)
.as[?]
ds
}
Run Code Online (Sandbox Code Playgroud)
并根据输入参数返回数据集。我不确定参数schemaInfo和cc应该是哪种类型?
我有这样的数据帧
df.show(5)
kv |list1 |list2 |p
[k1,v2|[1,2,5,9 |[5,1,7,9,6,3,1,4,9] |0.5
[k1,v3|[1,2,5,8,9|[5,1,7,9,6,3,1,4,15] |0.9
[k2,v2|[77,2,5,9]|[0,1,8,9,7,3,1,4,100]|0.01
[k5,v5|[1,0,5,9 |[5,1,7,9,6,3,1,4,3] |0.3
[k9,v2|[1,2,5,9 |[5,1,7,9,6,3,1,4,200]|2.5
df.count()
5200158
Run Code Online (Sandbox Code Playgroud)
我想获得最大p的行,这对我来说很有用,但我不知道是否有另一种清洁方式
val f = df.select(max(struct(
col("pp") +: df.columns.collect { case x if x != "p" => col(x) }: _*
))).first()
Run Code Online (Sandbox Code Playgroud) 我们可以使用以下方法从Java对象列表中创建一个数据框:
DataFrame df = sqlContext.createDataFrame(list, Example.class);
Run Code Online (Sandbox Code Playgroud)
对于Java,Spark可以直接从类(在这种情况下)推断模式Example.class。
如果有Scala,有没有办法做同样的事情?
我有一个包含这么多列的数据集,我想使用Java将所有列都转换为字符串。
我尝试了以下步骤,我想知道是否有更好的方法来实现这一目标?
Dataset<Row> ds = ...;
JavaRDD<String[]> stringArrRDD = ds.javaRDD().map(row->{
int length = row.length();
String[] columns = new String[length];
for(int i=0; i<length;i++){
columns[i] = row.get(i) !=null? row.get(i).toString():"";
}
return columns;});
Run Code Online (Sandbox Code Playgroud)