2016-10-30 64 views
0

以下是我正在使用的一個小應用程序中如何使用Spark-SQL。 我有兩個Hbase表t1,t2。SparkSQL:我正在做對嗎?

  • 我的輸入是一個csv文件,我解析每一行和查詢(SparkSQL)表t1。我將輸出寫入另一個文件。

  • 現在我解析第二個文件並查詢第二個表,並將某些函數應用於結果並輸出數據。 表t1具有購買細節,t2具有每個用戶隨時間框架添加到購物車的項目列表。

輸入 - >客戶ID(在csv文件的它列表)
輸出 - >甲CSV在下面提及的特定格式的文件。

CustomerID,他帶來的商品的詳細信息,他加入購物車的第一件商品,直到購買時加入購物車的所有商品。

對於1100條記錄的輸入,需要兩個小時才能完成整個過程!

我想知道如果我能加快這個過程,但我感到震驚。 有什麼幫助嗎?

+0

你真的需要中間文件嗎?你肯定不需要解析文件,如果你有RDD產生它 –

+0

是的我同意@ cricket_007該文件可以是另一個數據幀。不是嗎? –

+0

我不認爲需要花費時間的是解析,而是在表格上啓動1100個查詢。這個問題的答案很廣泛。您是否願意詳細說明您的文件中有哪些查詢,這樣我們才能真正提供幫助! – eliasah

回答

2

這個DataFrame方法如何...

1)從CSV創建一個數據框。

how-to-read-csv-file-as-dataframe 或類似的例子。

val csv = sqlContext.sparkContext.textFile(csvPath).map { 
    case(txt) => 
    try { 
     val reader = new CSVReader(new StringReader(txt), delimiter, quote, escape, headerLines) 
     val parsedRow = reader.readNext() 
     Row(mapSchema(parsedRow, schema) : _*) 
    } catch { 
    case e: IllegalArgumentException => throw new UnsupportedOperationException("converted from Arg to Op except") 
} 
    } 

2)創建從HBase的數據的另一個數據幀(如果使用的是Hortonworks)或phoenix

3)不加入和應用功能(可以是UDF或othewise時..等)和所得文件可能是一個數據幀再次

4)加入與第二表&輸出數據作爲CSV作爲結果數據幀以下面的僞代碼爲例...

應該可以使用自定義列和相應的值準備數據幀並保存爲CSV文件。 你也可以在火星殼中使用這種類型。

val df = sqlContext.read.format("com.databricks.spark.csv"). 
          option("header", "true"). 
          option("inferSchema","true"). 
          load("cars93.csv") 
    val df2=df.filter("quantity <= 4.0") 
    val col=df2.col("cost")*0.453592 
    val df3=df2.withColumn("finalcost",col) 
    df3.write.format("com.databricks.spark.csv"). 
          option("header","true"). 
          save("output-csv") 

希望這會有所幫助..祝你好運。

+0

Hbase連接器可能不是必需的。 Phoenix允許SQL對陣來自SparkSQL的Hbase –

+0

@RamPrasadG,我想到了使用數據框但我不認爲在我的情況下它會派上用場,在我的情況下,我希望輸出文件(CSV)具有特定的格式,我在我上面編輯的問題中提到過。 – theScalaGuy

+0

「我想以特定格式輸出文件(CSV)」這對那個特定格式的準備模式無關緊要..請看我更新的答案。 –