2017-05-21 74 views
0

我有一個簡單的數據幀其中有一些字符串cloumns:如何將撇號添加到字符串類型的列?

Name  age address 
micheal 21 Washington 
Jhon  10 San Franciso 

我想撇號添加到每個字符串類型列,我需要檢查 列的類型,並相應地改變它,帶來的將是:

Name  age address 
'micheal' 21 'Washington' 
'Jhon'  20 'San Francisco' 

我沒有多少列我會有,所以我需要動態查詢列的類型。

回答

1

有兩個要求,那麼:

我想撇號添加到每個字符串類型列

我沒有多少列,我將有

// load the dataset from a CSV file 
val names = spark. 
    read. 
    option("header", true). 
    option("inferSchema", true). 
    csv("names.txt") 
scala> names.show 
+-------+---+------------+ 
| Name|age|  address| 
+-------+---+------------+ 
|micheal| 21| Washington| 
| Jhon| 10|San Franciso| 
+-------+---+------------+ 

對於本特定情況下的模式如下:

​​

我們已經得到了字符串類型的兩個領域,但因爲我們不知道有多少列,我們將有一個並不重要的要求。

這就是星火SQL的斯卡拉據幀API實際上可以幫助其中的行是Dataset[Row]類型。

import org.apache.spark.sql.Row 
scala> names.collect.head.isInstanceOf[Row] 
res0: Boolean = true 

org.apache.spark.sql.Row's scaladoc

表示從關係運算符輸出的一行。允許通過序號進行通用訪問,這將導致原語的裝箱開銷以及原生原語訪問。

說了這麼多,該解決方案可以如下:

​​
+0

謝謝: ) 有效! – DarkSpark

+1

嗨:)我已經接受了答案,但是因爲我是新用戶,我的接受度計算得出,但並未公開顯示。再次感謝! – DarkSpark

1

一個快速和簡單的解決方案是map超過dtypesselect

import org.apache.spark.sql.functions.{col, concat, lit} 

val exprs = df.dtypes.map { 
// if column is a string concat with quotes and alias 
    case (c, "StringType") => concat(lit("'"), col(c), lit("'")).alias(c) 
    // otherwise keep as is. 
    case (c, _) => col(c) 
} 

df.select(exprs: _*).show 
+---------+---+---------------+ 
|  Name|age|  address| 
+---------+---+---------------+ 
|'michael'| 21| 'Washington'| 
| 'Jhon'| 20|'San Francisco'| 
+---------+---+---------------+ 
+0

感謝您的幫助:)作品:) – DarkSpark