spark 常用函式介紹(python)
全棧工程師開發手冊 (作者:欒鵬)
獲取SparkContext
python語法
1. 獲取sparkSession: se = SparkSession.builder.config(conf = SparkConf()).getOrCreate()
2. 獲取sparkContext: sc = se.sparkContext
3. 獲取sqlContext: sq = SparkSession.builder.getOrCreate()
4. 獲取DataFrame: df = sqlContext.createDataFrame(userRows)
資料格式
1. [[u'3', u'5'], [u'4', u'6'], [u'4', u'5'], [u'4', u'2']] 拆分或擷取的原始資料, 可以通過 map 中的 x[0], x[1] 來獲取對應列的資料 可以通過 map 來轉換為key-value 資料格式 例如: df3 = df2.map(lambda x: (x[0], x[1])) //python語法 2. key-value 資料格式 [(u'3', u'5'), (u'4', u'6'), (u'4', u'5'), (u'4', u'2')] 中每一個() 表示一組資料, 第一個表示key 第二個表示value 3)PipelinedRDD 型別表示 key-value形式資料
RDD
RDD是Spark中的抽象資料結構型別,任何資料在Spark中都被表示為RDD。從程式設計的角度來看,RDD可以簡單看成是一個數組。和普通陣列的區別是,RDD中的資料是分割槽儲存的,這樣不同分割槽的資料就可以分佈在不同的機器上,同時可以被並行處理。因此,Spark應用程式所做的無非是把需要處理的資料轉換為RDD,然後對RDD進行一系列的變換和操作從而得到結果。
建立RDD:
(1)、通過讀取本地或者hdfs上的檔案建立RDD
//scala語法 path = "hdfs://master:9000/examples/examples/src/main/resources/people.txt" rdd1 = sc.textFile(path,2) path = "file:///usr/local/spark/spark-1.6.0-bin-hadoop2.6/README.md" //local file rdd1 = sc.textFile(path,2)
(2)通過並行化的方式建立RDD. 其實就是通過我們自己取模擬資料
//scala語法
# list轉RDD
sc.parallelize([1,2,3,4,5], 3) #意思是將陣列中的元素轉換為RDD,並且儲存在3個分割槽上[1]、[2,3]、[4,5]。如果是4個分割槽:[1]、[2]、[3]、[4,5]
val str=Array("you jump","I jump")
val list = Array(1,2,3,4,5,6)
val listadd = sc.parallelize(list) 可以看到返回值就是RDD,當然可以呼叫RDD中的函式,比如reduce運算元等
listadd.reduce(_+_)
# rdd轉list
list = RDD.collect()
只要搞懂了spark的函式們,你就成功了一大半。
spark的函式主要分兩類,Transformations和Actions。Transformations為一些資料轉換類函式,actions為一些行動類函式:
轉換:轉換的返回值是一個新的RDD集合,而不是單個值。呼叫一個變換方法,不會有任何求值計算,它只獲取一個RDD作為引數,然後返回一個新的RDD。
行動:行動操作計算並返回一個新的值。當在一個RDD物件上呼叫行動函式時,會在這一時刻計算全部的資料處理查詢並返回結果值。
transformation 會針對已有的RDD建立一個新的RDD,而action則主要對RDD進行最後的操作。transformation只是記錄了對RDD的操作,並不會觸發spark程式的執行,只有當transform之後接著一個action操作,那麼所有的transformation才會執行。比如
//scala語法
val file=sc.textFile("hdfs://hadoop1:9000/hello.txt").flatMap(line => line.split("\t"))
回車之後並沒有觸發spark的執行,因為flatMap等屬於transformation操作
等到file.collect()後會看到spark的執行,collect是action操作
下面介紹spark常用的Transformations, Actions函式:
Transformations
map(func [, preservesPartitioning=False])
— 返回一個新的分散式資料集,這個資料集中的每個元素都是經過func函式處理過的。
//python語法
>>> data = [1,2,3,4,5]
>>> distData = sc.parallelize(data).map(lambda x: x+1).collect()
#結果:[2,3,4,5,6]
filter(func)
— 返回一個新的資料集,這個資料集中的元素是通過func函式篩選後返回為true的元素(簡單的說就是,對資料集中的每個元素進行篩選,如果符合條件則返回true,不符合返回false,最後將返回為true的元素組成新的資料集返回)。
//python語法
>>> rdd = sc.parallelize(data).filter(lambda x:x%2==0).collect()
#結果:[2, 4]
flatMap(func [, preservesPartitioning=False])
— 類似於map(func), 但是不同的是map對每個元素處理完後返回與原資料集相同元素數量的資料集,而flatMap返回的元素數不一定和原資料集相同。每個輸入元素可能被影射為0個或多個輸出元素。
//python語法
#### for flatMap()
>>> rdd = sc.parallelize([2,3,4])
>>> sorted(rdd.flatMap(lambda x: range(1,x)).collect())
#結果:[1, 1, 1, 2, 2, 3]
>>> sorted(rdd.flatMap(lambda x:[(x,x), (x,x)]).collect())
#結果:[(2, 2), (2, 2), (3, 3), (3, 3), (4, 4), (4, 4)]
#### for map()
>>> rdd = sc.parallelize([2,3,4])
>>> sorted(rdd.map(lambda x: range(1,x)).collect())
#結果:[[1], [1, 2], [1, 2, 3]]
>>> sorted(rdd.map(lambda x:[(x,x), (x,x)]).collect())
#結果:[[(2, 2), (2, 2)], [(3, 3), (3, 3)], [(4, 4), (4, 4)]]
mapPartitions(func [, preservesPartitioning=False])
—mapPartitions是map的一個變種。map的輸入函式是應用於RDD中每個元素,而mapPartitions的輸入函式是應用於每個分割槽,也就是把每個分割槽中的內容作為整體來處理的。
//python語法
>>> rdd = sc.parallelize([1,2,3,4,5], 3)
>>> def f(iterator): yield sum(iterator)
>>> rdd.mapPartitions(f).collect()
#結果:[1,5,9]
mapPartitionsWithIndex(func [, preservesPartitioning=False])
—類似於mapPartitions, 只是包含兩個引數.第一個引數為分割槽的索引,第二個引數為每個分割槽內的元素迭代器。輸出是一個包含元素列表的迭代器。
//python語法
>>> rdd = sc.parallelize([1,2,3,4,5], 3)
>>> def f(splitIndex, iterator): yield splitIndex
>>> rdd.mapPartitionsWithIndex(f).collect()
#結果:[0,1,2] #三個分割槽的索引
reduceByKey(func [, numPartitions=None, partitionFunc=<function portable_hash at 0x7fa664f3cb90>])
— reduceByKey就是對元素為kv對的RDD中Key相同的元素的value進行reduce,因此,key相同的多個元素的值被reduce為一個值,然後與原RDD中的key組成一個新的kv對。等價於pandas中的groupby
//python語法
>>> from operator import add
>>> rdd = sc.parallelize([("a", 1), ("b", 1), ("a", 1)])
>>> sorted(rdd.reduceByKey(add).collect())
>>> #或者 sorted(rdd.reduceByKey(lambda a,b:a+b).collect())
#結果:[('a', 2), ('b', 1)]
sortByKey([ascending=True, numPartitions=None, keyfunc=<function <lambda> at 0x7fa665048c80>])
返回排序後的資料集。該函式就是對kv對的RDD資料進行排序,keyfunc是對key進行處理的函式,如非需要,不用管。 也就是說先按keyfunc對key進行處理,然後按照key進行排序。
//python語法
>>> tmp = [('a', 1), ('b', 2), ('1', 3), ('D', 4)]
>>> sc.parallelize(tmp).sortByKey(True, 1).collect()
#結果: [('1', 3), ('D', 4), ('a', 1), ('b', 2)]
>>> sc.parallelize(tmp).sortByKey(True, 2, keyfunc=lambda k:k.lower()).collect()
#結果:[('1', 3), ('a', 1), ('b', 2), ('D', 4)]
#注意,比較兩個結果可看出,keyfunc對鍵的處理只是在資料處理的過程中起作用,不能真正的去改變鍵名
join(otherDataset [, numPartitions=None])
— join就是對元素為kv對的RDD中key相同的value收集到一起組成(v1,v2),然後與原RDD中的key組合成一個新的kv對,返回。即RDD1中的元素與RDD2中元素具有相同key值的嘗試合併。
//python語法
>>> x = sc.parallelize([("a", 1), ("b", 4)])
>>> y = sc.parallelize([("a", 2), ("a", 3)])
>>> sorted(x.join(y).collect())
#結果:[('a', (1, 2)), ('a', (1, 3))]
cartesian(otherDataset)
— 返回一個笛卡爾積的資料集,這個資料集是通過計算兩個RDDs得到的。即RDD1中的元素與RDD2中元素任意兩個元素嘗試合併。
//python語法
>>> x = sc.parallelize([1,2,3])
>>> y = sc.parallelize([4,5])
>>> x.cartesian(y).collect()
#結果:[(1, 4), (1, 5), (2, 4), (2, 5), (3, 4), (3, 5)]
RDD 刪除 重複 元素
intRdd.distinct() #去重
隨機將一個 RDD 通過指定比例 分為 2 個RDD
sRdd = stringRdd.randomSplit([0.4,0.6]) 將 stringRdd 以4:6 分為2個 RDD, 獲取其中一個 RDD 的方法為: sRdd[0]
RDD 中 groupBy 分組計算
//python語法
gRdd = intRdd.groupBy(lambda x: x<2) #將會分為2組, 訪問第一組: print(sorted(gRdd[0][1])), 訪問第二組:print(sorted(gRdd[1][1])),因為gRdd[0][0]和gRdd[1][0]表示預設生成的組名
分組並且取別名: gRdd = intRdd.groupBy(lambda x: "a" if(x < 2) else "b"),
(1)獲取第一組資訊: print(gRdd[0][0], sorted(gRdd[0][1]))
(2) 獲取第二組資訊: print(gRdd[1][0], sorted(gRdd[1][1])) 其中, 前半部分 gRdd[1][0] 表示獲取別名 a
Action (這裡只講支援python的)
reduce(func)
— reduce將RDD中元素兩兩傳遞給輸入函式,同時產生一個新的值,新產生的值與RDD中下一個元素再被傳遞給輸入函式直到最後只有一個值為止。
>>> from operator import add
>>> sc.parallelize([1,2,3,4,5]).reduce(add)
# 結果:15
collect()
— 返回RDD中的資料,以list形式。
>>> sc.parallelize([1,2,3,4,5]).collect()
#結果:[1,2,3,4,5]
count()
— 返回RDD中的元素個數。
>>> sc.parallelize([1,2,3,4,5]).count
#結果:5
first()
— 返回RDD中的第一個元素。
>>> sc.parallelize([1,2,3,4,5]).first()
#結果:1
take(n)
— 返回RDD中前n個元素。
>>> sc.parallelize([1,2,3,4,5]).take(2)
#結果:[1,2]
takeOrdered(n [, key=None])
— 返回RDD中前n個元素,但是是升序(預設)排列後的前n個元素,或者是通過key函式指定後的RDD(這個key我也沒理解透,後面在做詳解)。等價於sql語句裡面 order limit
>>> sc.parallelize([9,7,3,2,6,4]).takeOrdered(3)
#結果:[2,3,4]
>>> sc.parallelize([9,7,3,2,6,4]).takeOrdered(3, key=lambda x:-x)
#結果:[9,7,6]
1) intRdd1.stats() 統計 intRdd1, 結果為:(count: 5, mean: 5.0, stdev: 2.82842712475, max: 9, min: 1) mean表示平均值, stdev 表示標準差
2)intRdd3.min() 最新值,
3)intRdd3.max() 最大值
4)intRdd3.stdev() 標準差
5)intRdd3.count() 資料條數
6)intRdd3.sum() 求和
7)intRdd3.mean() 平均值
saveAsTextFile(path [, compressionCodecClass=None])
— 該函式將RDD儲存到檔案系統裡面,並且將其轉換為文字行的檔案中的每個元素呼叫 tostring 方法。path - 保存於檔案系統的路徑,compressionCodecClass壓縮編碼型別,如gzip
>>> tempFile = NamedTemporaryFile(delete=True)
>>> tempFile.close()
>>> sc.parallelize(range(10)).saveAsTextFile(tempFile.name)
>>> from fileinput import input
>>> from glob import glob
>>> ''.join(sorted(input(glob(tempFile.name + "/part-0000*"))))
'0\n1\n2\n3\n4\n5\n6\n7\n8\n9\n'
在儲存檔案的時候,空白行也是允許存在的。
>>> tempFile2 = NamedTemporaryFile(delete=True)
>>> tempFile2.close()
>>> sc.parallelize(['', 'foo', '', 'bar', '']).saveAsTextFile(tempFile2.name)
>>> ''.join(sorted(input(glob(tempFile2.name + "/part-0000*"))))
'\n\n\nbar\nfoo\n'
使用壓縮編碼
>>> tempFile3 = NamedTemporaryFile(delete=True)
>>> tempFile3.close()
>>> codec = "org.apache.hadoop.io.compress.GzipCodec"
>>> sc.parallelize(['foo', 'bar']).saveAsTextFile(tempFile3.name, codec)
>>> from fileinput import input, hook_compressed
>>> result = sorted(input(glob(tempFile3.name + "/part*.gz"), openhook=hook_compressed))
>>> b''.join(result).decode('utf-8')
u'bar\nfoo\n'
countByKey()
— 返回一個字典(key,count),該函式操作資料集為kv形式的資料,用於統計RDD中擁有相同key的元素個數。
>>> defdict = sc.parallelize([("a",1), ("b",1), ("a", 1)]).countByKey()
>>> defdict
#結果:defaultdict(<type 'int'>, {'a': 2, 'b': 1})
>>> defdict.items()
#結果:[('a', 2), ('b', 1)]
countByValue()
— 返回一個字典(value,count),該函式操作一個list資料集,用於統計RDD中擁有相同value的元素個數。
>>> sc.parallelize([1,2,3,1,2,5,3,2,3,2]).countByValue().items()
#結果:[(1, 2), (2, 4), (3, 3), (5, 1)]
foreach(func)
— 執行函式func來處理RDD中的每個元素,這個函式常被用來updating an Accumulator或者與外部儲存系統的互動。
>>> def f(x): print(x)
>>> sc.parallelize([1, 2, 3, 4, 5]).foreach(f)
#note: 列印是隨機的,並不是一定按1,2,3,4,5的順序列印
RDD key-value 基本轉換運算
1)kvRdd1 = sc.parallelize([(1, 4),(2, 5),(3, 6),(4, 7)]) 建立RDD key-value 源資料
結果為: [(1, 4), (2, 5), (3, 6), (4, 7)]
2)kvRdd1.keys() 獲取全部 key 的值
3)kvRdd1.values() 獲取全部 values 的值
4)kvRdd1.filter(lambda keyValue: keyValue[0] > 2) 過濾 key > 2 的資料
5)kvRdd1.filter(lambda keyValue: keyValue[1] >5) 過濾 value > 5 的資料
6)kvRdd1.mapValues(lambda x: x*x) 對每一條 value 進行運算
7)kvRdd1.sortByKey() 按照 key 從小到大 進行排序
8)kvRdd1.sortByKey(ascending=False) 按照 key 從大到小進行排序
9)kvRdd3.reduceByKey(lambda x, y:x+y) 將 key 相同的鍵的值合併相加
多個 RDD key-value 的轉換運算
1) join
intK1 = sc.parallelize([(1,5),(2,6),(3,7),(4,8),(5,9)])
intK2 = sc.parallelize([(3,30),(2,20),(6,60)])
intK1.join(intK2) join結果為:
[(2, (6, 20)), (3, (7, 30))]
2)leftJoin
intK1.leftOuterJoin(intK2).collect() leftJoin結果為:
[(2, (6, 20)), (4, (8, None)), (1, (5, None)), (3, (7, 30)), (5, (9, None))]
3)rightJoin rightJoin 結果為:
intK1.rithtOuterJoin(intK2).collect()
[(2, (6, 20)), (6, (None, 60)), (3, (7, 30))]
4)subtractByKey 從 intK1 中刪除 與 intK2 相同 key-value
intK1.subtractByKey(intK2) 結果為:
[(4, 8), (1, 5), (5, 9)]
Spark Shell的使用
Spark’s shell 提供了一種學習API的簡單方法, 也是一個強大的資料分析工具.它可以通過Scala(它是一種執行在Java虛擬機器上並且能夠使用Java庫的程式語言 )或者Python來操作. 在Spark 目錄下執行以下指令碼:
./bin/spark-shell (Scala)
./bin/pyspark (Python)
Spark-shell有兩種使用方式:
1:直接Spark-shell
會啟動一個SparkSubmit程序來模擬Spark執行環境,是一個單機版的。
2:Spark-shell --master Spark://hadoop1:7077,hadoop2:7077,hadoop3:7077 --total-executor-cores 5 --executor-memory 5G
指定任務提交的叢集路徑在哪裡。這就需要提前啟動一個真實的Standalone叢集。
可以指定多個master的地址,用逗號隔開。
如果沒有指定–total-executor-cores 5 --executor-memory 5G,那麼就會使用叢集中所有可用的資源,每一個worker中都會啟動executor。
spark提交指令碼命令(spark-submit使用及說明):
Python指令碼中需要在開頭匯入spark相關模組,呼叫時使用spark-submit提交
簡單的demo
本地檔案/lp/demo/data.txt
a a b d e te w qw
d r as r a b d a x
d s a v h f
as das
das g h r
python檔案/lp/demo/wordcount.py
"""用Python編寫的一個簡單Spark應用"""
import sys
from operator import add
from pyspark import SparkContext
if __name__ == "__main__":
sc= SparkContext.getOrCreate( )
path = 'file:///lp/demo/data.txt'
# 第一種方法
rdd1 = sc.textFile(path)
counts = rdd1.flatMap(lambda x: x.split(' ')).map(lambda x: (x, 1)).reduceByKey(add)
print(type(counts))
output = counts.collect()
for (word, count) in output:
print("%s: %i" % (word, count))
# 第二中方法
result = rdd1.flatMap(lambda x: x.split(' ')).countByValue().items()
print(result)
# 第三種方法
result = rdd1.flatMap(lambda x: x.split(' ')).map(lambda x: (x, 1)).countByKey().items()
print(result)
本機執行的模式執行python檔案
[[email protected] spark-2.3.0-bin-hadoop2.7]# ./bin/spark-submit /lp/demo/wordcount.py
在spark叢集上執行python檔案(Standalone模式)
[[email protected] spark-2.3.0-bin-hadoop2.7]# ./bin/spark-submit --master spark://localhost:7077 /lp/demo/wordcount.py
直接使用python直譯器執行。
python /lp/demo/wordcount.py
python直譯器執行帶有spark程式碼的python指令碼
如果使用python解釋執行帶有spark程式碼的python指令碼會報錯。
ImportError: No module named pyspark
ImportError: No module named py4j.java_gateway
缺少pyspark和py4j這兩個模組,這兩個包在Spark的安裝目錄裡,需要在環境變數裡定義PYTHONPATH,編輯~/.bashrc或者/etc/profile檔案均可
vi ~/.bashrc # 或者 sudo vi /etc/profile
# 新增下面這一行
export PYTHONPATH=$SPARK_HOME/python/:$SPARK_HOME/python/lib/py4j-0.10.1-src.zip:$PYTHONPATH
# 使其生效
source ~/.bashrc # 或者 sudo source /etc/profile
然後關閉終端,重新開啟,用python執行即可。重起後執行
python mypy.py
相關推薦
spark 常用函式介紹(python)
全棧工程師開發手冊 (作者:欒鵬) 獲取SparkContext python語法 1. 獲取sparkSession: se = SparkSession.builder.config(conf = SparkConf()).getOrCreate()
postgis常用函式介紹(一)
概述:在進行地理資訊系統開發的過程中,常用的空間資料庫有esri的sde,postgres的postgis以及mySQL的mysql gis等等,在本文,給大家介紹的是有關postgis的一些常用函式的意思以及使用。說明:本文中所使用postgres的版本為9.4.0,你可從
spark 常用函數介紹(python)
put ons value result 組成 hat 是把 mbo flat 原文引自:https://www.cnblogs.com/yxpblog/p/5269314.html 在開始之前,我先介紹一下,RDD是什麽? RDD是Spark中的抽象數據結構類
函式和常用模組【day04】:函式介紹(一)
本節內容 1、函式介紹 2、函式定義 3、為什麼要使用函式 一、介紹 在我們以往的學習程式設計的過程當中,碰到的最多的兩張程式設計方式或者說程式設計方法:面向過程和麵向物件。其實不管是哪一種,其實都是程式設計的方法論而已。但是現在有一種更古老的程式設計方式:函數語言程式設計,以它的不儲存的狀態,
lambda函式詳細介紹(Python)
定義 在Python中,除了使用def關鍵字宣告普通函式外,還提供了一種使用表示式生成函式物件的形式。由於它與LISP語言中的一個工具很相似,所以稱為lambda。 lambda函式也叫匿名函式,即沒有具體名稱的函式,它允許快速定義單行函式,可以用在任何需要
Python—numpy模組下函式介紹(一)numpy.ones、empty等
NumPy陣列的維數稱為秩(rank),一維陣列的秩為1,二維陣列的秩為2,以此類推。在NumPy中,每一個線性的陣列稱為是一個軸(axes),秩其實是描述軸的數量。比如說,二維陣列相當於是一個一維陣列,而這個一維陣列中每個元素又是一個一維陣列。所以這個一維陣列
Vertica的這些事—— 關於vertica常用函式介紹(持續更新ing)
取絕對值:select abs(-1);向上取整:select ceil(-1.001);向下取整:selectfloor(-1.001);取整:select trunc(-1.002);四捨五
Python3函式介紹(一)——函式引數
1.引數型別 ①位置引數 def hello_1(greeting,name): print(’%s,%s’%(greeting,name)) hello_1(‘Hi’,‘John’) Hi,John ②關鍵字引數 ③預設引數
網絡爬蟲簡單介紹(python)
我們 大型 搜索 () 介紹 面積 截取 困難 狀況 一、簡介 爬蟲就是利用代碼大量的將網頁前端代碼下載下來使用的一種程序,一般來說常見的目的為下: 1、商業分析使用:很多大數據公司都會從利用爬蟲來進行數據分析與處理,比如說要了解廣州當地二手房的均價走勢就可以到房屋中介的網
Hive常用函式大全(二)(視窗函式、分析函式、增強group)
視窗函式與分析函式 應用場景: (1)用於分割槽排序 (2)動態Group By (3)Top N (4)累計計算 (5)層次查詢 視窗函式 FIRST_VALUE:取分組內排序後,截止到當前行,第一個值 LAST_VALUE: 取分組內排序後,截止到當前行,最
numpy中一些常用函式記錄(3)
1. np.prod() : prod函式用於求陣列元素的乘積。 Note: 陣列沒有元素,即為空時,得到的值為 1.0 In [2]: np.prod([]) Out[2]: 1.0 In [4]: np.prod([[],[]]) Out[4]: 1.0
RabbitMQ使用介紹(python)
在我們的專案開發過程中,我們有時會有時候有兩個或者多個程式互動的情況,當然就會使用到這裡的訊息佇列來實現。現在比較火的就是RabbitMQ,還有一些ZeroMQ ,ActiveMQ 等等,著名的openstack預設用的RabbitMQ來實現的。 python中我們使用pika模組來操作訊息佇列,當然Cel
STM32之RTC實時時鐘庫函式介紹(1)
本章主要是介紹RTC的響應庫函式使用方法。 1.RTC_ITConfig函式的功能是使能或者失能指定的RTC中斷,其中輸入引數是32位的待使能或失能的RTC中斷源。但是在使用該函式之前,必須先呼叫函式RTC_WaitForLastTask(),等待標誌位RTOFF被設定。
oracle中的函式介紹(一):nvl函式、decode函式、case when函式、sum函式
最近做專案接觸到的oracle資料庫比較多,經常用到裡面的一些函式,以前的部落格中也介紹過行轉列和列轉行,這次再簡單給大家介紹幾個: nvl() NVL(a,b)就是判斷a是否是NULL,如果不
Hive常用函式總結(下)
這篇繼續我們介紹我們的函式,上篇連結: https://blog.csdn.net/Forever_ck/article/details/85268145 閒話少敘,開整: current_date 獲取當前日期 rtrim 去除字串右邊空格 split 將字串按
Hive常用函式總結(上)
在我們開發數倉專案的過程中,我們常常需要寫一些複雜的 hql 語句來完成我們的業務邏輯,今天我們就來聊聊那些Hive中自帶的常用函式。 一、Hive中內建函式圖解 二、常用函式總結:(常用的數學和日期函式) round() 四捨五入取值 ceil 向上取整 sq
C檔案讀寫函式介紹(轉)
1. 首先要理解幾個概念: 檔案: 按一定規則儲存在磁碟上的資料集合。 檔名: 能唯一標識某個磁碟檔案的字串。形式: 碟符:/ 路徑 / 檔名.副檔名 文字檔案:: 資料以其數字字元的ASCII碼形式、一個位元組一個位元組地儲存在磁碟上。 二進位制檔案:資料以二進位制形式在儲存在磁碟上。 裝置檔案:輸入
非常實用的PHP常用函式彙總(一)
1、PHP加密解密 PHP加密和解密函式可以用來加密一些有用的字串存放在資料庫裡,並且通過可逆解密字串,該函式使用了base64和MD5加密和解密。 程式碼如下: function encryptDecrypt($key, $string, $decr
部分Dojo常用函式簡介(三)——頁面生命週期及DOM相關常用函式
每個Ajax 框架都對Javascript 做了擴充套件,提供了很多常用函式,增強了 Javascript 的開發效率。在這裡將對部分Dojo 中的常用函式做簡單的介紹。由於Dojo的常用函式較多,也為方便大家閱讀,將這些常用函式分為了五個類別分別進行介紹。本文將介紹第三部分
opencv常用函式整理(一)
cvDestroyWindow() 清除視窗記憶體 cvDestroyWindow("視窗名稱') cvReleaseImage() 清除IplImage圖形資料結構記憶體 cvReleaseImage(IplImage資料結構名稱) cvCreateTrackbar() 創立一個Trackbar在目標