scala/park中的数据转换
sumprice groupbybrand 挑战scala/park中的数据转换,scala,apache-spark,Scala,Apache Spark,sumprice groupbybrand 挑战 brand,month,price abc,jan, - \n abc,feb, 29 \n abc,mar, - \n abc,apr, 45.23 \n bb-c,jan, 34 \n bb-c,feb,-35 \n bb-c,mar, - \n -将csv文件读取到df1 -将价格数据类型字符串更改为double -已在df1上创建注册的临时表 -但仍然面临着修剪和修剪的问题 -将非数字替换为零 有人能帮我解决这个问题吗。理
brand,month,price
abc,jan, - \n
abc,feb, 29 \n
abc,mar, - \n
abc,apr, 45.23 \n
bb-c,jan, 34 \n
bb-c,feb,-35 \n
bb-c,mar, - \n
-将csv文件读取到df1
-将价格数据类型字符串更改为double
-已在df1上创建注册的临时表
-但仍然面临着修剪和修剪的问题
-将非数字替换为零
有人能帮我解决这个问题吗。理论解释:
简单地使用sqlContext读取csv文件,使用regexp_replace内置函数替换字符串以加倍强制转换和groupBy以及sum聚合,应该可以获得所需的输出
以编程方式解释:
我希望答案是有帮助的输入文件如下:品牌、月份、价格abc,一月,-abc,二月,29 abc,三月,-abc,四月,45.23 bb-c,一月,34 bb-c,二月,-35 bb-c,三月,-你能用你所做的所有事情更新吗-将csv文件读取到df1-将价格数据类型字符串更改为在df1上双重创建的注册临时表-但仍面临修剪问题-将非数字字符串的零替换为快速回复。。。我尝试了df.translate、df.regexp_replace,还尝试了寄存器临时表…您好,我使用了此代码,但问题是价格列XL表包含逗号1345,因为如果价格超过999,则此代码将其设置为空。请建议克服这个问题,然后在正则表达式中加入逗号,如[\\s+a-zA-Z-:,],如果我用替换,然后执行你的代码,你应该很好。。。非常感谢你的帮助。很高兴听到@chalapathipothuraju
1)csv file available in xl sheet
2)trim the extra spaces in price
3)replace non-numeric(" - ") with zero
4)sum the price group by brand
//1)csv file available in xl sheet
val df = sqlContext
.read
.format("com.databricks.spark.csv")
.option("header", true)
.load("path to the csv file")
df.show(false)
//+-----+-----+------+
//|brand|month|price |
//+-----+-----+------+
//|abc |jan | - |
//|abc |feb | 29 |
//|abc |mar | - |
//|abc |apr | 45.23|
//|bb-c |jan | 34 |
//|bb-c |feb |-35 |
//|bb-c |mar | - |
//+-----+-----+------+
import org.apache.spark.sql.functions._
//2)trim the extra spaces in price
//3)replace non-numeric(" - ") with zero
df.withColumn("price", regexp_replace(col("price"), "[\\s+a-zA-Z- :]", "").cast("double"))
//4)sum the price group by brand
.groupBy("brand")
.agg(sum("price").as("price_sum"))
.show(false)
//+-----+-----------------+
//|brand|price_sum |
//+-----+-----------------+
//|abc |74.22999999999999|
//|bb-c |69.0 |
//+-----+-----------------+