有谁能告诉我如何使用spark-shell为.csv文件编写查询?
我所取得的是使用databricks库读取.csv文件并创建一个数据帧,如下所示:
./spark-shell --packages.com.databricks:spark-csv_2.10:1.4.0
import org.apache.spark.sql.SQLContext
val sqlContect = new SQLContext(sc)
val df = sqlContext.read.format("com.databricks.spark.csv") .option("header", "true").load("mylocalpath.csv")
然后我可以毫无问题地执行df.printSchema()和其他datafram操作。但我想知道如何写一些查询?
我在http://spark.apache.org/docs/latest/sql-programming-guide.html上看到了指令并且它提到了一些关于以编程方式指定架构的内容,我按照它的步骤来阅读文本文件的.csv文件,但当我val rowRDD = people.map(_.split(",")).map(p => Row(p(0), p(1).trim))
时,我得到了一个错误,说值拆分不是org.apache.spark.sql.Row的成员。我该如何解决这个问题?
如果有更简单的方法来编写SQL查询,请告诉我。我最终想要做的就是选择两列,一个用于id,一个用于价格,并且尽可能简单地回收最高价格。
df.printSchema()如下所示:
|-- TAXROLL_NUMBER: string (nullable = true)
|-- BUILDING_NAME: string (nullable = true)
|-- ASSESSED_VALUE: string (nullable = true)
|-- STREET_NAME: string (nullable = true)
|-- POSTAL_CODE: string (nullable = true)
|-- CITY: string (nullable = true)
|-- BUILD_YEAR: string (nullable = true)
|-- Lon: string (nullable = true)
|-- Lat: string (nullable = true)
答案 0 :(得分:2)
我不确定我是否完全跟随你,但也许你需要的只是
df.registerTempTable("TblName") //temp table registration
或
df.saveAsTable("TblName") //actual physical table registration
并使用
进行查询sqlContext.sql("select * from TblName limit 100").take(100).foreach(println)
或任何其他spark-sql查询。
我认为您的问题是因为在使用spark-csv软件包读取CSV后尝试进行RDD工作。此包返回的类型如您所述 - org.apache.spark.sql.Row。 您可以轻松使用RDD方法 - 只需使用textFile读取csv文件即可。例如:
case class tmpSchema(TAXROLL_NUMBER: String, BUILDING_NAME: String, ASSESSED_VALUE: String, STREET_NAME: String, CITY: String) // etc.
val toTable = sc.textFile(pathString).map(_.split(",")).map(p => tmpSchema(p(0), p(1) ,p(2), p(3), p(4)). toDF.registerTempTable("tblName2")
此方法不需要使用databricks csv包。另一方面,如果您的数据有一些封装和转义字符 - 您最好使用CSV包。
答案 1 :(得分:0)
Java Code Spark 2.0.0
let dic : [String: AnyObject?] = [
"Name": someString_Variable as NSString,
"Sum": someUInt64_Variable as NSNumber
]