You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by nc...@apache.org on 2017/02/13 22:13:22 UTC

[14/50] [abbrv] ambari git commit: AMBARI-19955 : added the is first row header functionality to upload table (nitirajrathore)

AMBARI-19955 : added the is first row header functionality to upload table (nitirajrathore)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/d7e11e9a
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/d7e11e9a
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/d7e11e9a

Branch: refs/heads/branch-feature-AMBARI-12556
Commit: d7e11e9abfde98618ff90f96b8a0952c30c6bef1
Parents: 97994e2
Author: Nitiraj Singh Rathore <ni...@gmail.com>
Authored: Fri Feb 10 16:15:59 2017 +0530
Committer: Nitiraj Singh Rathore <ni...@gmail.com>
Committed: Fri Feb 10 16:17:49 2017 +0530

----------------------------------------------------------------------
 .../ui/app/components/csv-format-params.js      |   1 -
 .../src/main/resources/ui/app/models/column.js  |   8 +-
 .../databases/database/tables/upload-table.js   | 199 +++----------------
 .../ui/app/services/table-operations.js         |   4 +-
 .../templates/components/csv-format-params.hbs  |  12 ++
 5 files changed, 49 insertions(+), 175 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/d7e11e9a/contrib/views/hive20/src/main/resources/ui/app/components/csv-format-params.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive20/src/main/resources/ui/app/components/csv-format-params.js b/contrib/views/hive20/src/main/resources/ui/app/components/csv-format-params.js
index 7a14ba8..5a8f00d 100644
--- a/contrib/views/hive20/src/main/resources/ui/app/components/csv-format-params.js
+++ b/contrib/views/hive20/src/main/resources/ui/app/components/csv-format-params.js
@@ -25,7 +25,6 @@ export default Ember.Component.extend({
   DEFAULT_CSV_QUOTE: '"',
   DEFAULT_CSV_ESCAPE: '\\',
   DEFAULT_FILE_TYPE: 'CSV',
-  isFirstRowHeader: false, // is first row  header
   csvParams: Ember.Object.create(),
   inputFileTypes: Ember.computed(function () {
     return Helpers.getUploadFileTypes();

http://git-wip-us.apache.org/repos/asf/ambari/blob/d7e11e9a/contrib/views/hive20/src/main/resources/ui/app/models/column.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive20/src/main/resources/ui/app/models/column.js b/contrib/views/hive20/src/main/resources/ui/app/models/column.js
index f38309b..73a9824 100644
--- a/contrib/views/hive20/src/main/resources/ui/app/models/column.js
+++ b/contrib/views/hive20/src/main/resources/ui/app/models/column.js
@@ -90,9 +90,11 @@ let Column = Ember.Object.extend(Ember.Copyable,{
       } else if(this.get('type.hasScale') && this.get('scale') && (this.get('precision') < this.get('scale'))) {
         this.get('errors').pushObject({type: 'precision', error: "Precision can only be greater than scale"});
       }
-
+    }else{
+      delete this.precision;
     }
 
+
     if(this.get('type.hasScale')) {
       if(Ember.isEmpty(this.get('scale'))) {
         this.get('errors').pushObject({type: 'scale', error: "Scale cannot be empty"});
@@ -101,8 +103,10 @@ let Column = Ember.Object.extend(Ember.Copyable,{
       } else if(this.get('scale') <= 0) {
         this.get('errors').pushObject({type: 'scale', error: "Scale can only be greater than zero"});
       }
-
+    }else{
+      delete this.scale;
     }
+
     return this.get('errors.length') === 0;
   },
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/d7e11e9a/contrib/views/hive20/src/main/resources/ui/app/routes/databases/database/tables/upload-table.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive20/src/main/resources/ui/app/routes/databases/database/tables/upload-table.js b/contrib/views/hive20/src/main/resources/ui/app/routes/databases/database/tables/upload-table.js
index ba3260c..0e61905 100644
--- a/contrib/views/hive20/src/main/resources/ui/app/routes/databases/database/tables/upload-table.js
+++ b/contrib/views/hive20/src/main/resources/ui/app/routes/databases/database/tables/upload-table.js
@@ -21,44 +21,31 @@ import NewTable from './new';
 import constants from '../../../../utils/constants';
 import Column from '../../../../models/column';
 import datatypes from '../../../../configs/datatypes';
+import Helpers from '../../../../configs/helpers';
 
 export default NewTable.extend({
   COLUMN_NAME_REGEX: "^[a-zA-Z]{1}[a-zA-Z0-9_]*$",
   TABLE_NAME_REGEX: "^[a-zA-Z]{1}[a-zA-Z0-9_]*$",
   HDFS_PATH_REGEX: "^[/]{1}.+",  // unix path allows everything but here we have to mention full path so starts with /
-  init: function () {
-    this._super();
-  },
-
-  COLUMN_NAME_PREFIX : "column",
-  i18n : Ember.inject.service('i18n'),
+  i18n : Ember.inject.service("i18n"),
   jobService: Ember.inject.service(constants.services.jobs),
   notifyService: Ember.inject.service(constants.services.alertMessages),
   showErrors: false,
-  baseUrl: "/resources/upload",
-  header: null,  // header received from server
-  files: null, // files that need to be uploaded only file[0] is relevant
-  firstRow: [], // the actual first row of the table.
-  rows: null,  // preview rows received from server
-  databaseName: null,
-  selectedDatabase: null,
-  filePath: null,
-  tableName: null,
-  uploadProgressInfos : [],
-  DEFAULT_DB_NAME : 'default',
-  showPreview : false,
-  containsEndlines: false,
-  storedAsTextFile : Ember.computed.equal("selectedFileType","TEXTFILE"),
-  storedAsNotTextFile : Ember.computed.not("storedAsTextFile"),
+  init: function () {
+    this._super();
+  },
   setupController(controller, model) {
     this._super(controller, model);
     this.controller.set("showUploadTableModal", false);
   },
-  onChangeSelectedFileType: function(){
-    if(this.get('selectedFileType') === this.get('fileTypes')[1] && this.get('containsEndlines') === true){
-      this.set('containsEndlines', false);
-    }
-  }.observes("selectedFileType", "containsEndlines"),
+  getCharOptionByCharCode: function(charCode){
+    return Helpers.getAllTerminationCharacters().findBy("id", charCode + "");
+  },
+  // onChangeSelectedFileType: function(){
+  //   if(this.get('selectedFileType') === this.get('fileTypes')[1] && this.get('containsEndlines') === true){
+  //     this.set('containsEndlines', false);
+  //   }
+  // }.observes("selectedFileType", "containsEndlines"),
   getUploader(){
     return this.get('store').adapterFor('upload-table');
   },
@@ -78,37 +65,12 @@ export default NewTable.extend({
       Ember.set(item, 'name',  valueArray[index]);
     }, this);
   },
-  isFirstRowHeaderDidChange: function () {
-    if (this.get('isFirstRowHeader') != null && typeof this.get('isFirstRowHeader') !== 'undefined') {
-      if (this.get('isFirstRowHeader') == false) {
-        if (this.get('rows')) {
-          this.get('rows').unshiftObject({row: this.get('firstRow')});
-          this._setHeaderElements(this.get('header'),this.get('defaultColumnNames'));
-        }
-      } else if (this.get('header')) { // headers are available
-        // take first row of
-        this._setHeaderElements(this.get('header'),this.get('firstRow'));
-        this.get('rows').removeAt(0);
-      }
-
-      this.printValues();
-    }
-  }.observes('isFirstRowHeader'),
-
-  popUploadProgressInfos: function () {
-    // var msg = this.get('uploadProgressInfos').popObject();
-  },
 
   pushUploadProgressInfos : function(info){
     this.controller.set("uploadTableMessage", info);
     this.showUploadModal();
-    // this.get('uploadProgressInfos').pushObject(info);
   },
   clearUploadProgressModal : function(){
-    var len = this.get('uploadProgressInfos').length;
-    for( var i = 0 ; i < len ; i++){
-      this.popUploadProgressInfos();
-    }
   },
 
   hideUploadModal : function(){
@@ -121,28 +83,8 @@ export default NewTable.extend({
   },
 
   clearFields: function () {
-    this.set("showPreview",false);
-    this.set("hdfsPath");
-    this.set("header");
-    this.set("rows");
-    this.set("escapedBy");
-    this.set("fieldsTerminatedBy");
     this.set("error");
-    this.set('files');
-    this.set("firstRow");
-    this.set("selectedDatabase",null);
-    this.set("databaseName");
-    this.set("filePath");
-    this.set('tableName');
     this.clearUploadProgressModal();
-    this.printValues();
-  },
-
-  printValues: function () {
-    console.log("header : ", this.get('header'),
-      ". rows : ",this.get('rows'),". error : ", this.get('error'),
-      " isFirstRowHeader : ", this.get('isFirstRowHeader'),
-      "firstRow : ", this.get('firstRow'));
   },
 
   generateTempTableName: function () {
@@ -187,39 +129,14 @@ export default NewTable.extend({
     let csvParams = sourceObject.get("fileFormatInfo.csvParams");
 
     return this.getUploader().uploadFiles('preview', files, {
-      "isFirstRowHeader": sourceObject.get("isFirstRowHeader"),
       "inputFileType": sourceObject.get("fileFormatInfo.inputFileType").id,
+      "isFirstRowHeader": csvParams.get("isFirstRowHeader"),
       "csvDelimiter": csvParams.get("csvDelimiter").name,
       "csvEscape": csvParams.get("csvEscape").name,
       "csvQuote": csvParams.get("csvQuote").name
     });
   },
 
-  getAsciiChar : function(key){
-    if(!key){
-      return null;
-    }
-
-    var value = this.get(key);
-    if(value && value.id != -1) {
-      return String.fromCharCode(value.id);
-    }else{
-      return null;
-    }
-  },
-  getCSVParams : function(){
-    var csvd = this.getAsciiChar('csvDelimiter');
-    if(!csvd && csvd != 0) csvd = this.get('DEFAULT_CSV_DELIMITER');
-
-    var csvq = this.getAsciiChar('csvQuote');
-    if(!csvq && csvq != 0) csvq = this.get('DEFAULT_CSV_QUOTE');
-
-    var csve = this.getAsciiChar('csvEscape');
-    if(!csve && csve != 0) csve = this.get('DEFAULT_CSV_ESCAPE');
-
-    return {"csvDelimiter": csvd, "csvQuote" : csvq, "csvEscape": csve};
-  },
-
   uploadForPreviewFromHDFS: function (sourceObject) {
     console.log("uploadForPreviewFromHDFS called.");
     // this.validateHDFSPath(hdfsPath);
@@ -228,9 +145,9 @@ export default NewTable.extend({
     var csvParams = sourceObject.get("fileFormatInfo.csvParams");
 
     return this.getUploader().previewFromHDFS({
-      "isFirstRowHeader": sourceObject.get("fileFormatInfo.isFirstRowHeader"),
       "inputFileType": sourceObject.get("fileFormatInfo.inputFileType").id,
       "hdfsPath": hdfsPath,
+      "isFirstRowHeader": csvParams.get("isFirstRowHeader"),
       "csvDelimiter": csvParams.get("csvDelimiter").name,
       "csvEscape": csvParams.get("csvEscape").name,
       "csvQuote": csvParams.get("csvQuote").name
@@ -254,6 +171,7 @@ export default NewTable.extend({
         self.onGeneratePreviewFailure(error);
       }).catch(function (error) {
         console.log("inside catch : ", error);
+        throw error;
       }).finally(function () {
         console.log("finally hide the modal always after preview.");
         self.hideUploadModal();
@@ -276,25 +194,8 @@ export default NewTable.extend({
 
   previewTable: function (data) {
     console.log('inside previewTable. data : ', data);
-    var self = this;
-    var defaultColumnNames = data.header.map(function(item,index){
-      return { "name": self.COLUMN_NAME_PREFIX + (index + 1) }
-    });
-    this.set("defaultColumnNames",defaultColumnNames);
     this.set("previewData", data);
-    this.set("header", this.get("previewData.header"));
-    this.set('isFirstRowHeader', this.get("previewData.isFirstRowHeader"));
-    this.set('tableName', this.get("previewData.tableName"));
-    if (data.isFirstRowHeader == true) {
-      this.set("firstRow", this.get("previewData.header"));
-    }else {
-      if(data.rows.length > 0){
-        this.set("firstRow", this.get("previewData.rows")[0].row);
-      }else{
-        this.set("firstRow", Ember.A());
-      }
-    }
-    this.set("rows", this.get("previewData.rows"));
+    this.controller.set('tableName', this.get("previewData.tableName"));
     this.controller.set('tableName', this.get("previewData.tableName"));
     this.controller.set("rows", this.get("previewData.rows"));
     this.controller.set("columns", this.transformToColumnModelList(this.get("previewData.header")));
@@ -336,31 +237,6 @@ export default NewTable.extend({
     this.pushUploadProgressInfos(this.formatMessage('hive.messages.startingToCreateActualTable'));
     var retValue = this.createTable(tableData.get("tableMeta"));
     return retValue;
-    // var self = this;
-    this.pushUploadProgressInfos(this.formatMessage('hive.messages.startingToCreateActualTable'));
-    // var headers = this.get('header');
-    // var selectedDatabase = this.get('selectedDatabase');
-    // if (!selectedDatabase) {
-    //   throw new Error(this.translate('hive.errors.emptyDatabase', {database : this.translate("hive.words.database")}));
-    // }
-    //
-    // this.set('databaseName', this.get('selectedDatabase.id'));
-    // var databaseName = this.get('databaseName');
-    // var tableName = this.get("tableMeta").name;
-    // var isFirstRowHeader = this.get('isFirstRowHeader');
-    // var filetype = this.get("selectedFileType");
-    //
-    // this.validateInput(headers,tableName,databaseName,isFirstRowHeader);
-    // this.showUploadModal();
-    // var rowFormat = this.getRowFormat();
-    // return this.getUploader().createTable({
-    //   "isFirstRowHeader": isFirstRowHeader,
-    //   "header": headers,
-    //   "tableName": tableName,
-    //   "databaseName": databaseName,
-    //   "hiveFileType":filetype,
-    //   "rowFormat": { "fieldsTerminatedBy" : rowFormat.fieldsTerminatedBy, "escapedBy" : rowFormat.escapedBy}
-    // });
   },
   getRowFormat : function(){
     var fieldsTerminatedBy = this.getAsciiChar('fieldsTerminatedBy');
@@ -369,7 +245,6 @@ export default NewTable.extend({
   },
   waitForCreateActualTable: function (jobId) {
     console.log("waitForCreateActualTable");
-    this.popUploadProgressInfos();
     this.pushUploadProgressInfos(this.formatMessage('hive.messages.waitingToCreateActualTable'));
     var self = this;
     var p = new Ember.RSVP.Promise(function (resolve, reject) {
@@ -380,12 +255,10 @@ export default NewTable.extend({
   },
   onCreateActualTableSuccess: function () {
     console.log("onCreateTableSuccess");
-    this.popUploadProgressInfos();
     this.pushUploadProgressInfos(this.formatMessage('hive.messages.successfullyCreatedActualTable'));
   },
   onCreateActualTableFailure: function (error) {
     console.log("onCreateActualTableFailure");
-    this.popUploadProgressInfos();
     this.pushUploadProgressInfos(this.formatMessage('hive.messages.failedToCreateActualTable'));
     this.setError(error);
   },
@@ -420,20 +293,19 @@ export default NewTable.extend({
     tableMeta.settings.fileFormat = {};
     tableMeta.settings.fileFormat.type = "TEXTFILE";
     this.set("tableData.tempTableMeta", tableMeta);
+    if(!tableMeta.settings){
+      tableMeta.settings = {};
+    }
+    if(!tableMeta.settings.rowFormat){
+      tableMeta.settings.rowFormat = {};
+    }
+    tableMeta.settings.rowFormat.fieldTerminatedBy = this.getCharOptionByCharCode(1);
+    tableMeta.settings.rowFormat.escapeDefinedAs = this.getCharOptionByCharCode(0);
     return this.createTable(tableMeta);
-    // return this.getUploader().createTable({
-    //   "isFirstRowHeader": this.get("isFirstRowHeader"),
-    //   "header": headers,
-    //   "tableName": tempTableName,
-    //   "databaseName": this.get('databaseName'),
-    //   "hiveFileType":"TEXTFILE",
-    //   "rowFormat": { "fieldsTerminatedBy" : parseInt('1', 10), "escapedBy" : null}
-    // });
   },
 
   waitForCreateTempTable: function (jobId) {
     console.log("waitForCreateTempTable");
-    this.popUploadProgressInfos();
     this.pushUploadProgressInfos(this.formatMessage('hive.messages.waitingToCreateTemporaryTable'));
     var self = this;
     var p = new Ember.RSVP.Promise(function (resolve, reject) {
@@ -445,7 +317,6 @@ export default NewTable.extend({
 
   onCreateTempTableSuccess: function () {
     console.log("onCreateTempTableSuccess");
-    this.popUploadProgressInfos();
     this.pushUploadProgressInfos(this.formatMessage('hive.messages.successfullyCreatedTemporaryTable'));
   },
 
@@ -467,11 +338,9 @@ export default NewTable.extend({
         self.waitForJobStatus(job.id, resolve, reject);
       });
     }).then(function () {
-      self.popUploadProgressInfos();
       self.pushUploadProgressInfos(this.formatMessage('hive.messages.succesfullyDeletedTable',{table:tableLabel}));
       return Ember.RSVP.Promise.resolve();
     }, function (err) {
-      self.popUploadProgressInfos();
       self.pushUploadProgressInfos(this.formatMessage('hive.messages.failedToDeleteTable',{table:tableLabel}));
       self.setError(err);
       return Ember.RSVP.Promise.reject();
@@ -479,7 +348,7 @@ export default NewTable.extend({
   },
 
   rollBackActualTableCreation : function(){
-    return this.deleteTableOnError(this.get("database"),this.get("tableMeta").name,this.translate('hive.words.actual'));
+    return this.deleteTableOnError(this.get("tableData.database"),this.get("tableData.tableMeta").name,this.translate('hive.words.actual'));
   },
 
   translate : function(str,vars){
@@ -491,7 +360,6 @@ export default NewTable.extend({
   onCreateTempTableFailure : function(error){
     console.log("onCreateTempTableFailure");
     this.setError(error);
-    this.popUploadProgressInfos();
     this.pushUploadProgressInfos(this.formatMessage('hive.messages.failedToCreateTemporaryTable'));
     return this.rollBackActualTableCreation().then(function(data){
       return Ember.RSVP.Promise.reject(error); // always reject for the flow to stop
@@ -513,7 +381,6 @@ export default NewTable.extend({
 
   waitForUploadingFile: function (data) {
     console.log("waitForUploadingFile");
-    this.popUploadProgressInfos();
     this.pushUploadProgressInfos(this.formatMessage('hive.messages.waitingToUploadFile'));
     if( data.jobId ){
       var self = this;
@@ -528,13 +395,12 @@ export default NewTable.extend({
 
   onUploadingFileSuccess: function () {
     console.log("onUploadingFileSuccess");
-    this.popUploadProgressInfos();
     this.pushUploadProgressInfos(this.formatMessage('hive.messages.successfullyUploadedFile') );
   },
 
   rollBackTempTableCreation: function () {
     var self = this;
-    return this.deleteTableOnError(this.get("database"),this.get("tempTableMeta").name,this.translate('hive.words.temporary')).then(function(data){
+    return this.deleteTableOnError(this.get("tableData.database"),this.get("tableData.tempTableMeta").name,this.translate('hive.words.temporary')).then(function(data){
       return self.rollBackActualTableCreation();
     },function(err){
       return self.rollBackActualTableCreation();
@@ -544,7 +410,6 @@ export default NewTable.extend({
   onUploadingFileFailure: function (error) {
     console.log("onUploadingFileFailure");
     this.setError(error);
-    this.popUploadProgressInfos();
     this.pushUploadProgressInfos(this.formatMessage('hive.messages.failedToUploadFile'));
     return this.rollBackTempTableCreation().then(function(data){
       return Ember.RSVP.Promise.reject(error); // always reject for the flow to stop
@@ -579,7 +444,6 @@ export default NewTable.extend({
 
   waitForInsertIntoTable: function (jobId) {
     console.log("waitForInsertIntoTable");
-    this.popUploadProgressInfos();
     this.pushUploadProgressInfos(this.formatMessage('hive.messages.waitingToInsertRows'));
     var self = this;
     var p = new Ember.RSVP.Promise(function (resolve, reject) {
@@ -591,14 +455,12 @@ export default NewTable.extend({
 
   onInsertIntoTableSuccess: function () {
     console.log("onInsertIntoTableSuccess");
-    this.popUploadProgressInfos();
     this.pushUploadProgressInfos(this.formatMessage('hive.messages.successfullyInsertedRows'));
   },
 
   onInsertIntoTableFailure: function (error) {
     console.log("onInsertIntoTableFailure");
     this.setError(error);
-    this.popUploadProgressInfos();
     this.pushUploadProgressInfos(this.formatMessage('hive.messages.failedToInsertRows'));
     return this.rollBackUploadFile().then(function(data){
       return Ember.RSVP.Promise.reject(error); // always reject for the flow to stop
@@ -617,7 +479,6 @@ export default NewTable.extend({
   },
   waitForDeleteTempTable: function (jobId) {
     console.log("waitForDeleteTempTable");
-    this.popUploadProgressInfos();
     this.pushUploadProgressInfos(this.formatMessage('hive.messages.waitingToDeleteTemporaryTable'));
     var self = this;
     var p = new Ember.RSVP.Promise(function (resolve, reject) {
@@ -628,7 +489,6 @@ export default NewTable.extend({
   },
   onDeleteTempTableSuccess: function () {
     console.log("onDeleteTempTableSuccess");
-    this.popUploadProgressInfos();
     this.pushUploadProgressInfos(this.formatMessage('hive.messages.successfullyDeletedTemporaryTable'));
     this.onUploadSuccessfull();
   },
@@ -801,32 +661,31 @@ export default NewTable.extend({
     let header = columns; //JSON.stringify(columns);
 
     return this.getUploader().uploadFromHDFS({
-      "isFirstRowHeader": tableData.get("fileFormatInfo.isFirstRowHeader"),
       "databaseName": tableData.get("database"),
       "tableName": tableData.get("tempTableMeta").name,
       "inputFileType": tableData.get("fileFormatInfo.inputFileType").id,
       "hdfsPath": tableData.get("fileInfo.hdfsPath"),
       "header": header,
       "containsEndlines": tableData.get("fileFormatInfo.containsEndlines"),
+      "isFirstRowHeader": csvParams.get("isFirstRowHeader"),
       "csvDelimiter": csvParams.get("csvDelimiter").name,
       "csvEscape": csvParams.get("csvEscape").name,
       "csvQuote": csvParams.get("csvQuote").name
     });
   },
   uploadTable: function (tableData) {
-    this.printValues();
     var csvParams = tableData.get("fileFormatInfo.csvParams");
     let columns = tableData.get("tableMeta").columns.map(function(column){
       return {"name": column.get("name"), "type": column.get("type.label")};
     });
     let header = JSON.stringify(columns);
     return this.getUploader().uploadFiles('upload', tableData.get("fileInfo.files"), {
-      "isFirstRowHeader": tableData.get("fileFormatInfo.isFirstRowHeader"),
       "databaseName" :  tableData.get("database"),
       "tableName" : tableData.get("tempTableMeta").name,
       "inputFileType" : tableData.get("fileFormatInfo.inputFileType").id,
       "header": header,
       "containsEndlines": tableData.get("fileFormatInfo.containsEndlines"),
+      "isFirstRowHeader": csvParams.get("isFirstRowHeader"),
       "csvDelimiter": csvParams.get("csvDelimiter").name,
       "csvEscape": csvParams.get("csvEscape").name,
       "csvQuote": csvParams.get("csvQuote").name

http://git-wip-us.apache.org/repos/asf/ambari/blob/d7e11e9a/contrib/views/hive20/src/main/resources/ui/app/services/table-operations.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive20/src/main/resources/ui/app/services/table-operations.js b/contrib/views/hive20/src/main/resources/ui/app/services/table-operations.js
index a5be574..2071317 100644
--- a/contrib/views/hive20/src/main/resources/ui/app/services/table-operations.js
+++ b/contrib/views/hive20/src/main/resources/ui/app/services/table-operations.js
@@ -178,12 +178,12 @@ export default Ember.Service.extend({
       }
 
       if (!Ember.isEmpty(storageSettings.rowFormat.nullDefinedAs)) {
-        parameters['serialization.null.format'] = String.fromCharCode(storageSettings.rowFormat.fieldTerminatedBy.id);
+        parameters['serialization.null.format'] = String.fromCharCode(storageSettings.rowFormat.nullDefinedAs.id);
         addParameters = true;
       }
 
       if (!Ember.isEmpty(storageSettings.rowFormat.escapeDefinedAs)) {
-        parameters['escape.delim'] = String.fromCharCode(storageSettings.rowFormat.linesTerminatedBy.id);
+        parameters['escape.delim'] = String.fromCharCode(storageSettings.rowFormat.escapeDefinedAs.id);
         addParameters = true;
       }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/d7e11e9a/contrib/views/hive20/src/main/resources/ui/app/templates/components/csv-format-params.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/hive20/src/main/resources/ui/app/templates/components/csv-format-params.hbs b/contrib/views/hive20/src/main/resources/ui/app/templates/components/csv-format-params.hbs
index a7cb862..c63f502 100644
--- a/contrib/views/hive20/src/main/resources/ui/app/templates/components/csv-format-params.hbs
+++ b/contrib/views/hive20/src/main/resources/ui/app/templates/components/csv-format-params.hbs
@@ -110,6 +110,18 @@
         </div>
       </div>
     </div>
+    <div class="row">
+      <div class="col-md-6 form-horizontal">
+        <div class="form-group">
+          <label class="col-md-2 control-label">Is First Row Header</label>
+          <div class="col-md-4">
+            <label>
+              {{input type="checkbox" checked=fileFormatInfo.csvParams.isFirstRowHeader}}
+            </label>
+          </div>
+        </div>
+      </div>
+    </div>
     {{/if}}
   </div>
   {{/if}}