2017-07-17 41 views
0

試圖從JSON文件創建DataFrame,但是當我加載數據時,Spark會自動推斷出數據中的數值是Long類型的,儘管它們實際上是整數,並且這也是我解析數據的方式碼。Spark如何從JSON中推斷數字類型?

由於我在測試環境中加載數據,因此我不介意使用一些變通方法來修復模式。我試過以上幾條,如:

  • 更改使用UDF
  • 定義整個架構手動

的問題是,該架構手動

  • 鑄造數據模式非常複雜,而且我之後的字段是嵌套的,這使得上面的所有選項都無關緊要或者太複雜,無法從頭開始編寫。

    我的主要問題是,火花如何決定數值是整數還是長整數?有什麼我可以做的,以強制所有\一些數字是一個特定的類型?

    謝謝!

  • 回答

    1

    默認情況下它總是LongType。

    從源代碼:

    // For Integer values, use LongType by default. 
    case INT | LONG => LongType 
    

    所以你不能改變這種行爲。您可以通過列迭代,然後做鑄造:

    for (c <- schema.fields.filter(_.dataType.isInstanceOf[NumericType])) { 
        df.withColumn(c.name, col(c.name).cast(IntegerType)) 
    } 
    

    這只是一個片段,但這樣的事情應該可以幫助您:)