2017-01-30 6 views
6

परिदृश्य:अपाचे स्पार्क: SparkSql में, एसक्यूएल के एसक्यूएल इंजेक्शन की चपेट में हैं

कहो हाइव में एक टेबल है, और इसके नीचे SparkSql अपाचे में स्पार्क, जहां तालिका नाम पारित हो जाता है का उपयोग कर क्वेरी की जाती है एक तर्क के रूप में और क्वेरी से जुड़े हुए हैं।

गैर-वितरित प्रणाली के मामले में, मुझे SQL-इंजेक्शन भेद्यता की मूल समझ है और जेडीबीसी के संदर्भ में उन प्रकार के परिदृश्य में createStatement/readyStatement के उपयोग को समझते हैं।

लेकिन स्पार्कस्क्ल के मामले में इस परिदृश्य के बारे में क्या, यह कोड कमजोर है? कोई अंतर्दृष्टि?

def main(args: Array[String]) { 

    val sconf = new SparkConf().setAppName("TestApp") 
    val sparkContext = new SparkContext(sconf) 
    val hiveSqlContext = new org.apache.spark.sql.hive.HiveContext(sparkContext) 

    val tableName = args(0) // passed as an argument 

    val tableData = hiveSqlContext.sql("select IdNUm, Name from hiveSchemaName." + tableName + " where IdNum <> '' ") 
             .map(x => (x.getString(0), x.getString(1))).collectAsMap() 


    ................ 
    ............... 

} 

उत्तर

2

आप स्पार्क 2.0 में निम्नलिखित की कोशिश कर सकते हैं:

def main(args: Array[String]) { 
val conf = new SparkConf() 

val sparkSession = SparkSession 
    .builder() 
    .appName("TestApp") 
    .config(conf) 
    .enableHiveSupport() 
    .getOrCreate() 

val tableName = args(0) // passed as an argument 

val tableData = sparkSession 
.table(tableName) 
.select($"IdNum", $"Name") 
.filter($"IdNum" =!= "") 
.map(x => (x.getString(0), x.getString(1))).collectAsMap() 


................ 
............... 

} `

+0

स्पार्क सत्र v2.0 और बाद में उपलब्ध है। 1.5 में इसे करने के लिए प्रतिबंध की आवश्यकता है। क्या स्पार्क कॉन्टेक्स्ट का उपयोग sqlContext या hiveSqlContext के माध्यम से समान काम करना संभव है? –

+2

आप SparkSession –

0

जावा में आम तौर पर सबसे आम तरीका एसक्यूएल इंजेक्शन खतरों को संभालने के लिए तैयार बयानों उपयोग करने के लिए है।

आप उस के लिए स्कैला पुस्तकालयों को देखने के लिए जावा पुस्तकालयों या स्कैला में Google तैयार कथन का उपयोग कर सकते हैं। चूंकि वेब अनुप्रयोगों में स्कैला का भी उपयोग किया जाता है, मुझे यकीन है कि इस तरह के पुस्तकालय मौजूद हैं ..

+0

हाँ के बजाय SqlContext का उपयोग कर सकते हैं, नियमित अनुप्रयोगों के लिए हम आपके द्वारा बताए गए तरीके से जाते हैं, लेकिन अपाचे स्पार्क एसक्यूएल के संदर्भ में देख रहे थे। –

+1

मुझे यकीन नहीं है कि स्पार्क में एक निर्मित समाधान है ... जो समझ में आता है क्योंकि यह एक एप्लीकेशन डीबी होने का इरादा नहीं है जो उपयोगकर्ताओं से इनपुट प्राप्त करेगा। यदि आप "स्पार्क रास्ता" जाना चाहते हैं तो आप डेटाफ्रेम एपीआई का उपयोग एसक्यूएल के बिना कर सकते हैं जैसे कि अन्य जवाब सुझाए गए हैं जो आपके स्केनेरियो फिट बैठता है –

संबंधित मुद्दे