2016-02-05 2 views
1

Я использую Спарк 1.5.1различное поведение при использовании createDataFrame и read.df в SparkR

Когда я делаю это

df <- createDataFrame(sqlContext, iris) 

#creating a new column for category "Setosa" 

df$Species1<-ifelse((df)[[5]]=="setosa",1,0) 

head(df) 

вывод: новая колонка, созданная

 Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
1  5.1   3.5   1.4   0.2   setosa 
2  4.9   3.0   1.4   0.2   setosa 
3  4.7   3.2   1.3   0.2   setosa 
4  4.6   3.1   1.5   0.2   setosa 
5  5.0   3.6   1.4   0.2   setosa 
6  5.4   3.9   1.7   0.4   setosa 

но когда Я сохранил набор данных диафрагмы в виде файла CSV и попытаюсь прочитать его и преобразовать в блок данных frameR

df <- read.df(sqlContext,"/Users/devesh/Github/deveshgit2/bdaml/data/iris/", 
       source = "com.databricks.spark.csv",header = "true",inferSchema = "true") 

теперь, когда я пытаюсь создать новый столбец

df$Species1<-ifelse((df)[[5]]=="setosa",1,0) 

Я получаю ошибку ниже:

16/02/05 12:11:01 ERROR RBackendHandler: col on 922 failed Error in select(x, x$"*", alias(col, colName)) :  
error in evaluating the argument 'col' in selecting a method for function 'select': Error in invokeJava(isStatic = FALSE, objId$id, methodName, ...) :  
org.apache.spark.sql.AnalysisException: Cannot resolve column name "Sepal.Length" among (Sepal.Length, Sepal.Width, Petal.Length, Petal.Width, Species);  
at org.apache.spark.s 

ответ

0

SparkSQL не поддерживает имена со встроенными точками. Когда вы используете createDataFrame, имена автоматически корректируются для вас, для других методов вам необходимо явно предоставить схему:

schema <- structType(
    structField("Sepal_Length", "double"), 
    structField("Sepal_Width", "double"), 
    structField("Petal_Length", "double"),  
    structField("Petal_Width", "double"), 
    structField("Species", "string")) 

df <- read.df(sqlContext, path, source = "com.databricks.spark.csv", 
    header="true", schema=schema)